2016-10-01 84 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參數進行計算。