天天看點

Eclipse 中設定JVM 記憶體及JVM監控調優

當我們在IDE控制台發現:

Eclipse 中設定JVM 記憶體及JVM監控調優

說明我們給jvm的持久代設定的值太小,此時你需要打開eclispe 中window->preferences->Java->Installed JRE ,點選右側的Edit 按鈕,在編輯界面中的 “Default VM Arguments ”選項中,将-XX:PermSize及 -XX:MaxPermSize的值加大。

如果你懂jvm性能調優的話,從jstat監控中可以得知其中的關系。以下為實際示範操作:

1,按照如下圖步驟将-XX:PermSize及 -XX:MaxPermSize的值修改到足夠小,故意造項目啟動報錯,我設定為32m.然後儲存。

Eclipse 中設定JVM 記憶體及JVM監控調優

2.在IDE中啟動tomcat的同時打開dos視窗,使用jps指令擷取程序id:(此程序id即為在windows任務管理器-程序中的javaw.exe的程序id)

Eclipse 中設定JVM 記憶體及JVM監控調優

3.并立即執行jvm監控:

Eclipse 中設定JVM 記憶體及JVM監控調優

現在對上圖來進行分析:

發現PU等于PC的值,并且也等于前面在IDE中設定的-XX:MaxPermSize的值(32768/1024=32m),結合後面的術語能看明白持久代使用的空間已經達到了最大值32m了,故報出了“java.lang.OutOfMemoryError: PermGen space”錯誤。

另如果發現YGC值特别大的話,那就将-Xmn的值設定大一點(通過-Xmn10m 選項來指定S0C、S1C和EC的總和為10m的),特别注意FGC,盡量使FGC的值不要太大(解決辦法:将-Xms及-Xmx的值設定大一點),,因為FGC在垃圾回收期間會檢查所有存活的對象,是以會花費比YGC更長的時間。進而讓你的應用反應遲鈍,是以應該盡量減少FGC. (所有的垃圾收集都是“Stop the World”事件,因為所有的應用線程都會停下來直到操作完成)

一些術語的中文解釋:

S0C:年輕代中第一個survivor(幸存區)的容量 (位元組)

S1C:年輕代中第二個survivor(幸存區)的容量 (位元組)

S0U:年輕代中第一個survivor(幸存區)目前已使用空間 (位元組)

S1U:年輕代中第二個survivor(幸存區)目前已使用空間 (位元組)

EC:年輕代中Eden(伊甸園)的容量 (位元組)

EU:年輕代中Eden(伊甸園)目前已使用空間 (位元組)

OC:Old代的容量 (位元組)

OU:Old代目前已使用空間 (位元組)

PC:Perm(持久代)的容量 (位元組)

PU:Perm(持久代)目前已使用空間 (位元組)

YGC:從應用程式啟動到采樣時年輕代中gc次數

YGCT:從應用程式啟動到采樣時年輕代中gc所用時間(s)

FGC:從應用程式啟動到采樣時old代(全gc)gc次數

FGCT:從應用程式啟動到采樣時old代(全gc)gc所用時間(s)

GCT:從應用程式啟動到采樣時gc用的總時間(s)

VM 開關 VM 開關描述
-Xms 設定JVM啟動時堆的初始化大小。
-Xmx 設定堆最大值。
-Xmn 設定年輕代的空間大小,剩下的為老年代的空間大小。
-XX:PermGen 設定永久代記憶體的初始化大小。
-XX:MaxPermGen 設定永久代的最大值。
-XX:SurvivorRatio 提供Eden區和survivor區的空間比例。比如,如果年輕代的大小為10m并且VM開關是-XX:SurvivorRatio=2,那麼将會保留5m記憶體給Eden區和每個Survivor區配置設定2.5m記憶體。預設比例是8。
-XX:NewRatio 提供年老代和年輕代的比例大小。預設值是2。

繼續閱讀