-Xms
およびオプションを使用すると-Xmx
、メモリ割り当てプールの初期サイズと最大サイズを設定できます。私が見つけたLinuxとAIXでstrace/trussを使用すると、JVMは内部で(k)mmapシステムコールを使用します。アドレス-ParameterはNULLであるため、オペレーティングシステムは、メモリをマップする仮想メモリアドレスを決定します。
$ truss java -Xmx512M Hello 2>&1 | grep mmap
kmmap(0x00000000, 536870912, 3, 17, -1, 0x00000000, 0x00000000) = 0xB0000000
このアドレスを指定することは可能ですか?
背景:Java Native Interface(JNI)を介してレガシーコードを呼び出す必要があります。これには、メモリ内の特定の場所にマップされた大量の再配置不可能なデータ(32ビットアドレス空間で2 GB)が必要です。この領域は、Javaのメモリ割り当てプールの場所と重複しています。
編集:これは実際のメモリレイアウトです:
0x0... AIX
0x1... Text
0x2... Stack
0x3... Heap
0x4... Heap
...... Legacy Data (2 GB)
0xd... Shared Library Text
0xe... unused
0xf... Shared Library Data
私の目標は、Javaメモリ割り当てプールを0xb/0xcから0x3/0x4セグメントに移動することです。これは、標準(非大容量)メモリモデルでも使用できます。