【问题标题】:Calculating Used Memory of a JVM计算 JVM 的已用内存
【发布时间】:2016-09-05 12:19:04
【问题描述】:

我想计算 JVM 堆的已用内存。我在示例应用程序中执行了以下操作。

  1. 将 JVM 堆大小设置为 Xms=200mb 和 Xmx=200mb。

  2. 使用 Java Runtime API 进行如下计算。它为我提供了示例程序的以下输出。

    运行时总内存:192413696

    运行时最大内存:192413696

    运行时可用内存:39734096

    运行时可用内存 = (max - total + free) = 39734096

    已用内存百分比 = 100*(max-available)/max = 100*(192413696- 39734096)/192413696 = 79.35%

  3. 通过 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%
    

您能帮我解决以下问题吗?

  1. 使用 JMX 和 Java 运行时 API 的区别是什么原因?

  2. 如果我想知道我的 JVM 堆中占用的内存,这是正确的方法(第 2 点或第 3 点)。我的目的是在我的 JVM 发生内存不足之前发出警报。

我还有另一个观察结果。当我使用 CMS 算法时(将 -Xms 和 -Xms 设置为 32GB,占用率设置为 70%),我可以看到使用 MBeans 计算的可用内存和 java 运行时 freeMemory() 之间的差异。当我使用 G1 时,我找不到这些差异(Mbeans 和运行时 API 给出了相同的值)。

【问题讨论】:

标签: java memory jvm heap-memory


【解决方案1】:
Runtime rt = Runtime.getRuntime();
long mem = rt.totalMemory();
long fm = rt.freeMemory();
long mm = rt.maxMemory();
long used = mm - fm;

【讨论】:

    【解决方案2】:

    计算应该是usedMemory / MaxMemory * 100

    Used Memory = 127737896
    Max Memory = 201850880
    
    127737896 / 201850880 * 100 = 63.28%
    

    【讨论】:

      猜你喜欢
      • 2019-04-17
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多