为什么java获取的最大堆内存和设置的不一致
2017-11-10 14:40
399 查看
因为业务的原因,需要获取当前虚拟机设置的最大堆内存大小,通过以下代码:
测试运行时,通过设置启动参数-Xmx来指定最大堆内存,结果发现每次都存在差异。
以设置-Xmx512m为例,通过jconsole查看JVM的内存分布情况:
堆内存最大值:506,816Kb(494.9375Mb)
伊甸园区Eden Space:139,776Kb(136.5Mb)
幸存区Survivor Space:17472Kb(17.0625Mb)
老年代Tenured Gen:349,568Kb(341.375Mb)
136.5M+17.0625M*2+341.375M=512M
512M-494.9375M=17.0625M
正好差异了一个幸存区的大小?
对其他的情况(不同-Xmx)也做了统计,也是如此。
改变幸存区大小呢,目前伊甸园区与幸存区大小比例为136.5:17.0625=8:1,就是JVM默认为8:1:1,如下图:
通过参数-XX:SurvivorRatio=18,改变幸存区大小,输出结果的为:
max heap:527958016(503.5m)
8226
差异512-503.5=8.5m
而这时幸存区大小正好为8704Kb,即8.5Mb。
自认为原因应该是:
通过MemoryMXBean 获取的最大堆内存,应该是JVM可以使用的最大堆内存。因为两个幸存区,采用的是标记拷贝的GC算法,实际分配时,永远有一个幸存区是不能被使用的,所以最大堆内存没有包含这一部分。
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); MemoryUsage heapMemory= memoryMXBean.getHeapMemoryUsage(); long maxHeap = heapMemory.getMax();
测试运行时,通过设置启动参数-Xmx来指定最大堆内存,结果发现每次都存在差异。
-Xmx | maxHeap |
1024m | 1037959168(989.875m) |
768m | 778502144(742.4375m) |
512m | 518979584(494.9375m) |
堆内存最大值:506,816Kb(494.9375Mb)
伊甸园区Eden Space:139,776Kb(136.5Mb)
幸存区Survivor Space:17472Kb(17.0625Mb)
老年代Tenured Gen:349,568Kb(341.375Mb)
136.5M+17.0625M*2+341.375M=512M
512M-494.9375M=17.0625M
正好差异了一个幸存区的大小?
对其他的情况(不同-Xmx)也做了统计,也是如此。
改变幸存区大小呢,目前伊甸园区与幸存区大小比例为136.5:17.0625=8:1,就是JVM默认为8:1:1,如下图:
通过参数-XX:SurvivorRatio=18,改变幸存区大小,输出结果的为:
max heap:527958016(503.5m)
8226
差异512-503.5=8.5m
而这时幸存区大小正好为8704Kb,即8.5Mb。
自认为原因应该是:
通过MemoryMXBean 获取的最大堆内存,应该是JVM可以使用的最大堆内存。因为两个幸存区,采用的是标记拷贝的GC算法,实际分配时,永远有一个幸存区是不能被使用的,所以最大堆内存没有包含这一部分。
相关文章推荐
- Java之最大堆内存设置(-Xmx)
- java查看最大内存设置
- java 可设置最大内存
- 为什么Java使用System.getenv()获取刚刚设置的环境变量时为空
- Java Hour 64 JVM 最大内存设置
- 【封装】java中为什么要将属性进行私有化,又使用set和get方法来设置和获取属性呢?
- 各类Java heap space 解决方法,并通过java代码获取JVM的相关信息,所在操作系统的信息(包含eclipse&myeclipse的调试的内存设置)
- 为什么JAVA进程占用内存会超过Xmx设置
- java 可设置最大内存
- java 可设置最大内存
- java中设置虚拟机最大内存
- 转:java 可设置最大内存
- java进程使用的最大内存的数值
- Tomcat的内存设置(Tomcat java.lang.OutOfMemoryError )
- 为什么要设置JAVA_HOME&Path&CLASSPATH&CATALINA_HOME
- JAVA内存设置
- 为什么wince5.0 只能支持最大内存是512M?
- Java通过调用Top命令获取Linux的CPU和内存使用情况
- 如何手动设置SQL server的最大内存占用
- java.lang.OutOfMemoryError: Java heap space JVM内存设置