简体   繁体   中英

Xmx and gc log data not matching

I ran a test program (adds list with string in a infinite loop) using below jvm arguments

java -XX:+PrintGCDetails -Xloggc:gc.log Test -Xmx=1k -Xms=1k

and got the below exception

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

In the gc log i see the below collection as the last entry

11.242: [Full GC (Allocation Failure) [PSYoungGen: 0K->0K(92160K)] [ParOldGen: 274084K->274072K(371712K)] 274084K->274072K(**463872K**), [Metaspace: 2522K->2522K(1056768K)], 3.0296130 secs] [Times: user=3.28 sys=0.00, real=3.02 secs] 

If min and max is 1k how come the heap memory available is showing as 463872K ?

Plus in the oracle site

https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html

I see a note ,

Note: -Xmx does not limit the total amount of memory that the JVM can use.

What does this means?

You have specified Xmx and Xms parameters after the name of your class. Thus java executable command interprets them as parameters to your class, not as options to configure JVM. The correct way would be:

java -Xmx1k -Xms1k -XX:+PrintGCDetails -Xloggc:gc.log Test

Also note, that the correct format is -Xmx1k , not -Xmx=1k .

But please not, that JVM will not start with such low value of Xms.

@Nikem responded correctly and I would not like to respond to that part of the question. However, I would like to add something to your second question -

Note: -Xmx does not limit the total amount of memory that the JVM can use. What does this imply?

-Xmx only limits the memory available for consumption by your application heap.

But JVM will need memory space for PermGen and stack sizes which are not accounted for with the -Xmx parameter.

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