資源描述:
《WebSphere JVM classloader 內(nèi)存泄漏》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、WebSphere?JVM?classloader?內(nèi)存泄漏近段時間,我們項(xiàng)目中用到的WebSphere應(yīng)用服務(wù)器(WAS),但在客戶的production環(huán)境下極不穩(wěn)定,經(jīng)常宕機(jī)。給客戶造成非常不好的影響,同時,也給項(xiàng)目組很大壓力。為此,我們花了近一個月時間對其診斷,現(xiàn)在基本上穩(wěn)定了,需要繼續(xù)觀察一段時間?,F(xiàn)在我主要將工作做一個階段性的總結(jié)。我們的產(chǎn)品環(huán)境是:WAS6.0+DB28.1+AIX5.3+RS/6000。在該產(chǎn)品環(huán)境下,出現(xiàn)的問題非常多,現(xiàn)象如下:WAS經(jīng)常不穩(wěn)定、宕機(jī)幾乎一天一次,經(jīng)常報告OutOfMemory(內(nèi)存泄漏嗎?NO)。DB2
2、連接數(shù)過大,有時把DB2撐死,有時也把AIX撐死。AIX虛擬內(nèi)存報錯、分頁報錯、IO也報錯、還有很多其它莫名奇妙的錯??偸牵看螁栴}發(fā)生的現(xiàn)象和理論上的總是不一致,導(dǎo)致我們不知道從何入手,也無從檢測自己的優(yōu)化參數(shù)。咨詢過多次IBM技術(shù)支持,只解決了某些局部問題。雖然問題依然存在,但我想,解決問題的思路、特別是理論基礎(chǔ),還是有一些規(guī)律和原則。對于WAS這塊,我近段時間的主要時間集中在以下幾個方面(時間順序):1、Java性能監(jiān)測工具:Jprofiler,也用到Jprobe。后來發(fā)現(xiàn)Jprofiler在AIX下幾乎不可用。2、IBMJava虛擬機(jī)和WAS技術(shù)
3、細(xì)節(jié),特別是IBMJVM的GC原理,我發(fā)現(xiàn)它和sun、bea的差別很大。3、IBM的heap分析器HeapAnalyzer、GCCollector。這兩個事后監(jiān)測工具非常實(shí)用,特別是我們的產(chǎn)品運(yùn)行環(huán)境,非測試環(huán)境。4、某些Application的懷疑和診斷。5、AIX診斷,我?guī)缀鯖]有這個能力,只能常規(guī)監(jiān)測一下,需另請高人。我打算將本文分成以下幾個部分總結(jié):JVM原理、IBMJVM的GC策略和調(diào)優(yōu)。Jprofiler和IBM工具的實(shí)際體會WAS的診斷體會和AIX調(diào)優(yōu)下面開始主題吧,可能比較零碎,另外,開始的理論篇基本上看書都可以,我只是總結(jié)一下,再添加一些
4、自己的理解。以下是我參考的最重要的兩本電子書和一些網(wǎng)站:《InsideJavaVrtualMachine》:半部分有約四章我認(rèn)為非常棒,其它章節(jié)可能意義不大?!禩heJavaVirtualMachineSpecification,2nd》:前半部分有兩三章很不錯,不過可以對照上一本書看。sun的hotspot虛擬機(jī)技術(shù):http://java.sun.com/javase/technologies/hotspot/BEA的JRockit虛擬機(jī)技術(shù):http://edocs.bea.com/jrockit/geninfo/genintro/index.ht
5、mlJVM技術(shù)文檔入口,虛擬機(jī)理論,內(nèi)存泄漏診斷等的索引頁。IBM診斷資料:http://www-128.ibm.com/developerworks/java/jdk/diagnosis/上面有一個500多頁的pdf文檔,對IBMJVM技術(shù)和診斷講解很深入。我不得不提的是,在查資料這塊,BEA和Sun都有很好的官方文檔和論壇支持,并且官方文檔導(dǎo)航非常好。雖然IBM的診斷資料也不少,但需要搜索,其搜索是很痛苦的。而且,IBM官方論壇很差。如果用IBM的產(chǎn)品出問題,切記:找IBM技術(shù)支持,千萬不要蒙著頭搞!反正它們的產(chǎn)品很少免費(fèi)。說實(shí)話,它們的技術(shù)支持還是
6、挺負(fù)責(zé)的,一般會為你推薦很多support資料,而該資料往往都在developerworks網(wǎng)站上,屬于support那個頻道,但你就是搜不著。Java虛擬機(jī)規(guī)范概要研究Java虛擬機(jī),首先要了解Sun的Java虛擬機(jī)規(guī)范?,F(xiàn)在,該實(shí)現(xiàn)版本很多,如比較有名的Sun、IBM、BEA、Apple、HP、MS、ApacheHarmony。它們都實(shí)現(xiàn)了JVM規(guī)范,但有各自擴(kuò)展。譬如,針對IBM虛擬機(jī)的堆碎片導(dǎo)致OutOfMemory(OOM),在Sun的虛擬機(jī)上就不會發(fā)生。Sun的JVM有maxPermSize的概念,IBM就沒有,如果你設(shè)置這個參數(shù),虛擬機(jī)根本
7、就啟動不了。比較有意思的是,學(xué)Java,就一定要了解各種規(guī)范,這和MS的風(fēng)格很不一樣。Sun總是在定義一些規(guī)范,實(shí)現(xiàn)都留給各廠商。我們除了理解規(guī)范本身外,一定要理解規(guī)范和實(shí)現(xiàn)之間的關(guān)系,譬如JDBC規(guī)范和JDBC驅(qū)動的關(guān)系,它們是怎么組合到一起的。要是你用過php的xml解析庫,或db函數(shù),就會體會深刻,它們可沒有什么規(guī)范可言,所以每個數(shù)據(jù)庫廠商的db函數(shù)用法都不一樣。我推薦大家研讀一下HSQLDB的jdbc和Tomcat的servlet相關(guān)實(shí)現(xiàn),因?yàn)槲艺J(rèn)為它們還是比較好懂的。JVM規(guī)范只是定義一個虛擬機(jī)該做什么,但它并沒有要求你該怎么做。例如我們最常見
8、的Servlet規(guī)范,在該規(guī)范中,有HttpServletRequest、Htt