使用-Xms
和-Xmx
选项,可以设置内存分配池的初始大小和最大大小。在Linux和AIX上使用strace/truss,我发现JVM内部使用了(k)mmap系统调用。address参数为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段,这也适用于标准(非大型)内存模型。