JVM調優系列(二):從哪幾個角度考慮調優
你對JVM調優的方法瞭解多少,這裡和大家分享幾個,比如要升級JVM版本,如果能使用64-bit,使用64-bitJVM。基本上沒什麼好解釋的,很簡單將JVM升級到最新的版本。如果你還是使用JDK1.4甚至是更早的JVM,那你首先要做的就是升級。
JVM調優技巧總結
這篇是技巧性的文章,如果要找關於GC或者調整內純的文章,看我其他幾篇文章。因為是JVM調優總結,所以廢話少說。從各方面一共收集到以下幾個方法:
1.升級JVM版本。如果能使用64-bit,使用64-bitJVM。
基本上沒什麼好解釋的,很簡單將JVM升級到最新的版本。如果你還是使用JDK1.4甚至是更早的JVM,那你首先要做的就是升級。因為JVM從1.4->1.5->1.6可不是僅僅的版本號升級,或者僅僅往裡面加了一堆新的語言特性,這麼簡單。而是真正在JVM做了重大的改進,每次版本升級,都有巨大的效能升級。尤其是SUN認識到java是知己的全部的時候(誇張點,但連股票號都改成JAVA了,呵呵)。如果你經常逛SUN的JVM論壇,你就會發現實際上JVM上的毛病是這麼多。如果你因為各種原因,而不能升級到1.6,那你可以升級到該版本的最新版。
2.選擇一個正確的GC(GargageCollection)。
由於當JAVA程式GC的時候,會停下當前程式。尤其FullGC的時候,會停留很長時間。一般對於GUI程式來說,是很難接受的(想想Eclipse暫停的時候)。JAVA5以後,開始自帶了好幾種GC,你可以選擇一個適合你的種類。有以下四種SerialCollector,Parallelcollector,ConcurrentCollector,TrainCollector(廢棄)。後面幾種時候使用並行收集,所以理論上有效率更高(要求你有超過2CUP,但是現在多核開始普及了,呵呵)。提示:更改GC種類以後要適當挺高JVM的記憶體量。
3.正確設定記憶體大小。進行JVM調優時對JVM堆內的各個區域(young,old,perm)正確設定大小。
這個是最困難的調整,因為這個調整會直接影響GC的效率。而且由於各個程式的型別不用,所以沒有一個通用的資料。除了幾個常用規則以外,需要使用工具(jstat,jvmstat,jconsole等等)仔細調整。下面會提到幾個常用的準則。通常使用一下幾個引數調整-Xms-Xmx-XX:MaxPermSize。
3.1調高-XX:NewRatio(NewSize/MaxNewSize)的值,會減少younggc的次數,但會增加oldgc的時間。
3.2增加普通GC的方法(減小FullGC)。擴大young區域的大小(最大40%),並過大Survivor的區域。使得更多的object留在younggen。
4.減小類的使用量,注意類的load和unload,減少JSP頁數。
類實際上也是物件,會直接分配perm區域裡,即使FullGC也會很少收集。JSP也會分配到perm區域裡,效果同理。如果perm過大,超過XX:MaxPermSize值,會發生OutOfMemoryError:PermGenspace異常。解決方法是提高-XX:MaxPermSize值。
5.進行JVM調優時避免使用-Xnoclassgc
6.如果是RMI程式,要注意調整RMIDGC的時間。
◆以下是幾個寫程式時,應該注意的地方。也可減小GC,提高JVM效能。
1.不要使用System.gc()方法。
因為它會產生FullGC。
2.儘可能少分配大的臨時物件(生命週期短的)
可能會直接分配到old區域裡,old區域只有FullGC的時候會收集。
3.避免使用finalize()方法。
finalize()會增加GC的負擔,使用java.lang.ref代替。