【发布时间】:2017-08-29 16:51:08
【问题描述】:
我注意到 Java 堆分配是 2 MB 的倍数。例如,我以-Xmx values as 1021m, 1022m 启动JVM,两个JVM 都以1022m 的堆大小启动。同样,堆大小 1023m,1024m 以 1024m 开头。
输出如下:
C:\Users\myuser>java -Xmx1021m -XX:+PrintFlagsFinal -version | findstr "MaxHeapSize"
uintx MaxHeapSize := 1071644672
{product}
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode)
C:\Users\myuser>java -Xmx1022m -XX:+PrintFlagsFinal -version | findstr "MaxHeapSize"
uintx MaxHeapSize := 1071644672
{product}
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode)
在这两种情况下,它都将 MaxHeapSize 显示为 1071644672 字节,即 1022mb。
C:\Users\myuser>java -Xmx1023m -XX:+PrintFlagsFinal -version | findstr "MaxHeapSize"
uintx MaxHeapSize := 1073741824
{product}
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode)
C:\Users\myuser>java -Xmx1024m -XX:+PrintFlagsFinal -version | findstr "MaxHeapSize"
uintx MaxHeapSize := 1073741824
{product}
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode)
在这两种情况下,它都将 MaxHeapSize 显示为 1073741824 字节,即 1024mb。
这种行为与 Xms 类似。
问题 1:为什么堆大小会从指定值更改为 2 的下一个倍数?
问题 2:为什么当 JVM 实际启动时使用的值与指定的值不同时,Java 甚至没有警告我们
问题3:是否有flag或某种方式强制JVM创建一个1021mb的Heap?
问题 4:假设我的机器上有 1023mb 的可用内存,我尝试创建一个具有 1023mb 堆的 JVM。通过上述行为,它实际上尝试从不可用的 1024mb 开始。 JVM创建会失败吗?
【问题讨论】:
-
我猜这是您的操作系统而不是 JVM 的限制:操作系统通常有一个“内存页面”的概念 - 分配给进程的最小物理内存量。每个进程可以有很多页,但不能少于一页。您的操作系统恰好有 2MB 的页面大小。
-
@M.Prokhorov 您的评论几乎是正确的,唯一的更正是最小量的 虚拟 内存。说得更简单,内存页——虚拟,内存帧——物理。
-
@Eugene 如何为 Windows 和 linux 上的进程获取尽可能少的虚拟内存?
-
@Arun 你的意思是 我如何找到 windows 和 linux 的页面大小的最小值是多少? 你应该让问题更清楚一点,因为我没有明白,但可能只有我……
-
@Arun 还有.. 对于您的问题(我也希望尽快给出答案),您能指定您在哪个操作系统上运行它吗?
标签: java heap-memory