Check available heapSize programmatically?

18,470

You could use JMX to collect the usage of heap memory at runtime.


Code Example:

import java.lang.management.ManagementFactory;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryType;
import java.lang.management.MemoryUsage;

for (MemoryPoolMXBean mpBean: ManagementFactory.getMemoryPoolMXBeans()) {
    if (mpBean.getType() == MemoryType.HEAP) {
        System.out.printf(
            "Name: %s: %s\n",
            mpBean.getName(), mpBean.getUsage()
        );
    }
}

Output Example:

Name: Eden Space: init = 6619136(6464K) used = 3754304(3666K) committed = 6619136(6464K) max = 186253312(181888K)
Name: Survivor Space: init = 786432(768K) used = 0(0K) committed = 786432(768K) max = 23265280(22720K)
Name: Tenured Gen: init = 16449536(16064K) used = 0(0K) committed = 16449536(16064K) max = 465567744(454656K)

If your have question about "Eden Space" or "Survivor Space", check out How is the java memory pool divided

Share:
18,470
Johnydep
Author by

Johnydep

Updated on June 09, 2022

Comments

  • Johnydep
    Johnydep almost 2 years

    I am using Eclipse. The problem is my application crashes if the allocated memory is less then 512MB. Now is there anyway to check the available memory for a program before starting heavy memory exhaustive processing? For example, I know we can check available JVM heap size as:

    long heapSize = Runtime.getRuntime().totalMemory();
    System.out.println("Heap Size = " + heapSize);
    

    Problem is, this gives the JVM heap size. Even increasing it does not work using Eclipse. In Eclipse, if I change the VM arguments then it works. However the printout from above statements is always the same. Is there any command through which I can exactly know how much memory I am allocated for a particular application?

  • Johnydep
    Johnydep almost 13 years
    Yess but it dosent help really. I just want to know total allocated memory to my application by JVM or something like this. From configuration i know if it is less then 512MB, it dosent' work. But how can i check this pragmatically because once this app is packaged, if it is crashing at run time, there should be a mecahnism to prompt user about the nature of error. In worse case i will catch exception and prompt the user to increase memory size, but that would be after the crash, but not before the start. Unfortuanatelly it takes about 30 mins before it crashes and it would be a waste of time.
  • Danijel
    Danijel almost 11 years
    Did you set your JAVA_OPTS or CATALINA_OPTS? What about -Xmx (max heap size) parameter? Maybe it crashes because it is out of memory at some point? What do the log files say, any outOfMemory errors?