简体   繁体   中英

Calculating Used Memory of a JVM

I want to calculate the used memory of a JVM heap. I did the following in a sample application.

  1. Set JVM heap size as Xms=200mb and Xmx=200mb.

  2. Did the calculation as follows using Java Runtime APIs. It gave me following output for sample program.

    Runtime total memory : 192413696

    Runtime max memory : 192413696

    Runtime free memory : 39734096

    Runtime available memory = (max - total + free) = 39734096

    Percentage of used memory = 100*(max-available)/max = 100*(192413696- 39734096)/192413696 = 79.35%

  3. Did another calculation via 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% 

Could you please help me with the following ?

  1. What is the reason for the difference between using JMX and Java Run time APIs ?

  2. If I want to know the memory occupied in my JVM heap which is the right approach (point 2 or point 3). My intention is to raise alerts before an out of memory occurs for my JVM.

I have another observation as well. When I use CMS algorithm (with -Xms and -Xms set to 32GB and Occupancy fraction set to 70%) I could see the difference between the free memory calculated using MBeans and java runtime freeMemory(). When I was using G1 I could not find these difference (the Mbeans and run time API gave same value).

Runtime rt = Runtime.getRuntime();
long mem = rt.totalMemory();
long fm = rt.freeMemory();
long mm = rt.maxMemory();
long used = mm - fm;

The calculation should be usedMemory / MaxMemory * 100

Used Memory = 127737896
Max Memory = 201850880

127737896 / 201850880 * 100 = 63.28%

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM