【发布时间】:2016-09-05 12:19:04
【问题描述】:
我想计算 JVM 堆的已用内存。我在示例应用程序中执行了以下操作。
将 JVM 堆大小设置为 Xms=200mb 和 Xmx=200mb。
-
使用 Java Runtime API 进行如下计算。它为我提供了示例程序的以下输出。
运行时总内存:192413696
运行时最大内存:192413696
运行时可用内存:39734096
运行时可用内存 = (max - total + free) = 39734096
已用内存百分比 = 100*(max-available)/max = 100*(192413696- 39734096)/192413696 = 79.35%
-
通过 JMX 进行了另一个计算:java.lang:type=Memory (Using MBean)
It gave me following output for the same program. Used memory : 127737896 Max memory : 201850880 Percentage of used memory = 100*(used/max) = 100* (127737896/201850880)= 63.28%
您能帮我解决以下问题吗?
使用 JMX 和 Java 运行时 API 的区别是什么原因?
如果我想知道我的 JVM 堆中占用的内存,这是正确的方法(第 2 点或第 3 点)。我的目的是在我的 JVM 发生内存不足之前发出警报。
我还有另一个观察结果。当我使用 CMS 算法时(将 -Xms 和 -Xms 设置为 32GB,占用率设置为 70%),我可以看到使用 MBeans 计算的可用内存和 java 运行时 freeMemory() 之间的差异。当我使用 G1 时,我找不到这些差异(Mbeans 和运行时 API 给出了相同的值)。
【问题讨论】:
-
您可能会发现this question 和MemoryMXBean documentation 很有趣。
-
感谢您的信息。我会详细检查的。
标签: java memory jvm heap-memory