java jvm 調優實戰

1.eclipse 打印gc日誌

   eclipse根目錄eclipse.ini 中設置如下:

-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-verbose:gc
-Xloggc:gc.log

 

2. Java中,棧的大小通過-Xss來設置,當棧中存儲數據比較多時,需要適當調大這個值,否則會出現java.lang.StackOverflowError異常。常見的出現這個異常的是無法返回的遞歸,因爲此時棧中保存的信息都是方法返回的記錄點。

    JDK5.0以後每個線程堆棧大小爲1M,以前每個線程堆棧大小爲256K。

 

Java Heap 堆分爲3個區
1.Young
2.Old
3.Permanent

Young保存剛實例化的對象。當該區被填滿時,GC會將對象移到Old區。Permanent區則負責保存反射對象,本文不討論該區。

JVM的Heap分配可以使用-X參數設定,

-Xms
初始Heap大小
-Xmx
java heap最大值

-Xmn
young generation的heap大小

當gc日誌出現

 [GC 0.209: [DefNew: 4416K->511K(4928K), 0.0034707 secs] 4416K->614K(15872K), 0.0035239 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

說明yong區設置過小,一般設置heap的1/4比較好.

java提示報錯:java.lang.OutOfMemoryError,設置堆內存過小,加大Xmx和Xms值。

3.[Perm : 24574K->24554K(24576K)], 0.1160431 secs] [Times: user=0.13 sys=0.00, real=0.13 secs]

PermGen space:全稱是Permanent Generation space.就是說是永久保存的區域,用於存放Class和Meta信息,Class在被Load的時候被放入該區域Heap space:存放Instance。

GC(Garbage Collection)應該不會對PermGen space進行清理,所以如果你的APP會LOAD很多CLASS的話,就很可能出現PermGen space錯誤,加大PermSize

 

-XX:PermSize=96m
-XX:MaxPermSize=96m

 

-XX:PermSize=96m
-XX:MaxPermSize=96m

 

 

-XX:PermSize=96m
-XX:MaxPermSize=96m
-XX:PermSize=96m
-XX:MaxPermSize=96m
-XX:PermSize=96m
-XX:MaxPermSize=96m

-XX:PermSize=96m
-XX:MaxPermSize=96m

 

 

附註:

堆與棧 stack and heap

    堆和棧是程序運行的關鍵,很有必要把他們的關係說清楚。

 

   

    棧是運行時的單位,而堆是存儲的單位

    棧解決程序的運行問題,即程序如何執行,或者說如何處理數據;堆解決的是數據存儲的問題,即數據怎麼放、放在哪兒。

    在Java中一個線程就會相應有一個線程棧與之對應,這點很容易理解,因爲不同的線程執行邏輯有所不同,因此需要一個獨立的線程棧。而堆則是所有線程共享 的。棧因爲是運行單位,因此裏面存儲的信息都是跟當前線程(或程序)相關信息的。包括局部變量、程序運行狀態、方法返回值等等;而堆只負責存儲對象信息。

發佈了93 篇原創文章 · 獲贊 0 · 訪問量 4270
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章