Xmx和gc日志数据不匹配

时间:2016-10-01 18:22:45

标签: java garbage-collection jvm

我使用下面的jvm参数运行了一个测试程序(使用字符串在无限循环中添加列表)

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

并得到以下异常

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

在gc日志中,我将以下集合视为最后一个条目

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] 

如果min和max为1k,那么堆内存可用的显示为463872K

在oracle网站上加

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

我看到一张纸条,

注意:-Xmx不限制JVM可以使用的内存总量。

这意味着什么?

2 个答案:

答案 0 :(得分:2)

您已在班级名称后面指定了XmxXms个参数。因此java可执行命令将它们解释为类的参数,而不是将其配置为配置JVM的选项。正确的方法是:

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

另请注意,正确的格式为-Xmx1k,而非-Xmx=1k

但请不要,JVM不会以如此低的Xms值开始。

答案 1 :(得分:0)

@Nikem回答正确,我不想回答这部分问题。但是,我想在你的第二个问题中添加一些内容 -

  

注意:-Xmx不限制JVM可以使用的内存总量。这意味着什么?

-Xmx仅限制应用程序堆可供使用的内存。

但是JVM将需要PermGen的内存空间和堆栈大小,而这些内容不考虑-Xmx参数。