資源描述:
《jvm調(diào)優(yōu)總結(jié)(7):調(diào)優(yōu)方法-java開發(fā)java經(jīng)驗技巧》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、JVM調(diào)優(yōu)總結(jié)(7):調(diào)優(yōu)方法-編程開發(fā)技術(shù)JVM調(diào)優(yōu)總結(jié)(7):調(diào)優(yōu)方法原文出處:pengjiahengJVM調(diào)優(yōu)工具Jconsole,jProfile,VisualVMJconsole:?jdk自帶,功能簡單,但是可以在系統(tǒng)有一定負荷的情況下使用。對垃圾回收算法有很詳細的跟蹤。詳細說明參考這里JProfiler:商業(yè)軟件,需要付費。功能強大。詳細說明參考這里VisualVM:JDK自帶,功能強大,與JProfiler類似。推薦。如何調(diào)優(yōu)觀察內(nèi)存釋放情況、集合類檢查、對象樹上面這些調(diào)優(yōu)工具都提供了強大的
2、功能,但是總的來說一般分為以下幾類功能堆信息查看可查看堆空間大小分配(年輕代、年老代、持久代分配)捉供即時的垃圾凹收功能垃圾監(jiān)控(長時間監(jiān)控回收情況)杳看堆內(nèi)類、對象信息杳看:數(shù)量、類型等對象引用情況查看?有了堆信息查看方面的功能,我們i般可以順利解決以下問題:-年老代年輕代大小劃分是否合理-內(nèi)存泄漏-垃圾回收算法設(shè)置是否合理線程監(jiān)控線程信息監(jiān)控:系統(tǒng)線程數(shù)量。線程狀態(tài)監(jiān)控:各個線程都處在什么樣的狀態(tài)下Dump線程詳細信息:查看線程內(nèi)部運行情況死鎖檢杳?熱點分析???CPU熱點:檢查系統(tǒng)哪些方法山用的大量
3、CPU時間???內(nèi)存熱點:檢查哪些對象在系統(tǒng)中數(shù)量最大(一定時間內(nèi)存活對象和銷毀對象一起統(tǒng)計)這兩個東四對丁系統(tǒng)優(yōu)化很冇幫助。我們可以根據(jù)找到的熱點,冇針對性的進行系統(tǒng)的瓶頸查找和進行系統(tǒng)優(yōu)化,而不是漫無目的的進行所有代碼的優(yōu)化??煺湛煺帐窍到y(tǒng)運行到某一時刻的一個定格。在我們進行調(diào)優(yōu)的吋候,不可能用眼睛去跟蹤所有系統(tǒng)變化,依賴快照功能,我們就可以進行系統(tǒng)兩個不同運行時刻,對彖(或類、線程等)的不同,以便快速找到問題舉例說,我要檢查系統(tǒng)進行垃圾冋收以后,是否還有該收冋的對象被遺漏下來的了。那么,我可以在進行
4、垃圾冋收前后,分別進行一次堆情況的快照,然后對比兩次快照的對象情況。內(nèi)存泄漏檢查內(nèi)存泄漏是比較常見的問題,而月?解決方法也比較通用,這里可以重點說一下,而線程、熱點方面的問題則是具體問題具體分析了。內(nèi)存泄漏一般可以理解為系統(tǒng)資源(各方面的資源,堆、棧、線程等)在錯誤使用的情況下,導(dǎo)致使用完畢的資源無法回收(或沒有回收),從而導(dǎo)致新的資源分配請求無法完成,引起系統(tǒng)錯誤。內(nèi)存泄漏對系統(tǒng)危害比較大,因為他可以直接導(dǎo)致系統(tǒng)的崩潰。需要區(qū)別一下,內(nèi)存泄漏和系統(tǒng)超負荷兩者是有區(qū)別的,雖然可能導(dǎo)致的最終結(jié)果是一樣的。內(nèi)
5、存泄漏是用完的資源沒有冋收引起錯誤,而系統(tǒng)超負荷則是系統(tǒng)確實沒有那么多資源可以分配了(其他的資源都在使用)。年老代堆空間被占滿異常:?java.lang.0utOfMemoryError:Javaheapspace說明:這是最典型的內(nèi)存泄漏方式,簡單說就是所有堆空間都被無法回收的垃圾對象占滿,虛擬機無法再在分配新空間。如上圖所示,這是非常典型的內(nèi)存泄漏的垃圾回收情況圖。所冇峰值部分都是一次垃圾冋收點,所有谷底部分表示是一次垃圾冋收后剩余的內(nèi)存。連接所有谷底的點,可以發(fā)現(xiàn)一?條由底到高的線,這說明,隨時間的
6、推移,系統(tǒng)的堆空間被不斷占滿,最終會占滿整個堆空間。因此可以初步認為系統(tǒng)內(nèi)部可能有內(nèi)存泄漏。(上面的圖僅供示例,在實際情況下收集數(shù)據(jù)的時間需要更長,比如幾個小時或者幾天)解決:這種方式解決起來也比較容易,一般就是根據(jù)垃圾回收前后情況對比,同吋根據(jù)對象引用情況(常見的集合對象引用)分析,基本都可以找到泄漏點。持久代被占滿異常:java.lang.0utOfMemoryError:PermGenspace說明:Perm空間被占滿。無法為新的class分配存儲空間而引發(fā)的異常。這個異常以前是沒有的,但是在Ja腹
7、反射大量使用的今天這個異常比較常見了。主要原因就是大量動態(tài)反射生成的類不斷被加載,最終導(dǎo)致Perm區(qū)被占滿。更可怕的是,不同的classLoader即便使用了相同的類,但是都會對英進行加載,相當于同一個東西,如果有N個classLoader那么他將會被加載N次。因此,某些情況下,這個問題基木視為無解。當然,存在大量classLoader和大量反射類的情況其實也不多。解決:1.-XX:MaxPermSize=16m2.換用JDK。比如JRocketo堆棧溢出異常:java.lang.StackOvcrflo
8、wError說明:這個就不多說了,一般就是遞歸沒返回,或者循環(huán)調(diào)用造成線程堆棧滿異常:Fatal:Stacksizetoosmall說明:java中一個線程的空間大小是有限制的。JDK5.0以后這個值是1M。與這個線程相關(guān)的數(shù)據(jù)將會保存在其中。但是當線程空間滿了以后,將會出現(xiàn)上面異常。解決:增加線程棧大小。-Xss2m。但這個配置無法解決根本問題,還??创a部分是否有造成泄漏的部分。系統(tǒng)內(nèi)存被占滿異常:java.lang.Ou