Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why max heap size is incorrect when I enable G1 garbage collector?

When I enable G1 in java application with -Xmx=1024m -XX:+UseG1GC. And using jvisualvm command to check max heap size. The max heap size is 2GB instead of 1GB.

Does anybody know why ?

like image 555
huuphongdn2009 Avatar asked Aug 12 '15 03:08

huuphongdn2009


People also ask

How do I set maximum heap size?

Under the Java tab, select JVM Options. Edit the -Xmx256m option. This option sets the JVM heap size. Set the -Xmx256m option to a higher value, such as Xmx1024m.

How does the Java 8 G1 garbage collector work?

G1 uses a pause prediction model to meet a user-defined pause time target and selects the number of regions to collect based on the specified pause time target. The regions identified by G1 as ripe for reclamation are garbage collected using evacuation.

What is G1 old gen heap?

G1 is a generational, incremental, parallel, mostly concurrent, stop-the-world, and evacuating garbage collector which monitors pause-time goals in each of the stop-the-world pauses. Similar to other collectors, G1 splits the heap into (virtual) young and old generations.

Is G1 available in Java 8?

At this stage, we will focus on the tried and tested G1 GC which is available in Java 8, as well as Java 11 (Supported JDK for most ForgeRock applications). The focus of this article will be Java 11.


1 Answers

The JVM allocates more heap memory from the OS than the usage.
Allocating memory is a heavy operation considering the performance.
So JVM always allocate extra memory then it needs.

Java also allocate memory for other things, including a stack for each thread. It is not unusual for the total memory consumption of the VM to exceed the value of -Xmx.

The JVM maintains two memory areas, the Java™ heap, and the native (or system) heap. These two heaps have different purposes and are maintained by different mechanisms.

The Java heap contains the instances of Java objects and is often referred to as 'the heap'. It is the Java heap that is maintained by Garbage Collection, and it is the Java heap that is changed by the command-line heap settings. The Java heap is allocated using mmap, or shmat if large page support is requested. The maximum size of the Java heap is preallocated during JVM startup as one contiguous area, even if the minimum heap size setting is lower.

The native, or system heap, is allocated by using the underlying malloc and free mechanisms of the operating system, and is used for the underlying implementation of particular Java objects; for example:

1) Compiled code generated by the Just In Time (JIT) Compiler
2) Threads to map to Java threads

jvisualvm is showing you java heap+system heap. whereas the -Xmx parameter is just affecting the java heap.
Link: http://www-01.ibm.com/support/knowledgecenter/SSYKE2_5.0.0/com.ibm.java.doc.diagnostics.50/diag/problem_determination/aix_mem_heaps.html

like image 60
Amit Bhati Avatar answered Oct 24 '22 01:10

Amit Bhati