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