2016-10-01 86 views
0

我跑了一个测试程序使用下面jvm参数XMX和GC日志数据不匹配

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堆怎么来m可用的emory显示为463872K

加在oracle网站

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

我看到一张纸条,

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

这是什么意思?

+0

请重新格式化您的帖子,它很难阅读 –

回答

2

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

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

还要注意,正确的格式是-Xmx1k,不-Xmx=1k

但请不要,JVM不会从这么低的Xms值开始。

+0

感谢您纠正错误,我试着用下面的jvm输入“java -Xms1m -Xmx1m -XX:+ PrintGCDetails -Xloggc:gc.log Test”并在GC中找到记录下面的行之前得到的内存“0.189:[全GC(分配失败)[PSYoungGen:480K-> 457K(1024K)] [ParOldGen:253K-> 238K(512K)] 734K-> 695K(1536K),[Metaspace :2522K-> 2522K(1056768K)],0.0310443秒] [时间:用户= 0.05 sys = 0.00,实际= 0.03秒]“,如果最小和最大为1m,我看到younggen + oldgen显示1m + 512k,理货:-(,包括@DROY –

0

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

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

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

但是JVM将需要内存空间来存放PermGen和堆栈大小,这些大小不会用-Xmx参数进行计算。