堆内存细分
现代垃圾回收器大部分是基于分代收集理论设计,堆空间可以细分为:
JDK8之前:新生代+养老区+永久区
JDK8及以后:新生代+养老区+元空间
其中,新生区又可以划分为:伊甸园区、幸存者0区、幸存者1区
设置堆内存大小
(1)-Xms:设置初始状态堆内存大小,
等价于-XX:InitialHeapSize
-Xmx:设置最大堆内存大小
等价于-XX:maxHeapSize
-Xmx和-Xms只能设置新生区+养老区内存大小,不能设置永久代的大小
(2)默认情况下,初始堆内存大小为物理电脑内存的64分之一,最大堆内存大小为物理电脑内存的4分之一
(3)获取JVM堆内存总量:(单位byte)
long Runtime.getRuntime().totalMemory(); //初始大小
long Runtime.getRuntime().maxMemory(); //最大大小
(4)建议将初始堆内存大小和最大堆内存大小设置成相同的值
(5)-Xms和-Xmx设置的值是新生区+养老区的总空间,如果输入-Xmx和-Xms的值的话,会发现输出的值比设置的值小(比如-Xms和-Xmx设置的大小都是600M,但是输出的值显示只有575M),这是因为新生区中包含伊甸园区、幸存者0区、幸存者1区,伊甸园区可以存放对象,但是幸存者0区和幸存者1区二者之间只能有一个存放对象,另一个不能(二选一),输出的-Xms和-Xmx就没有包含未存放对象的那个幸存者区,因此输出的值略小于设定的值