資源描述:
《探究內(nèi)存泄露—part2—分析問題-java開發(fā)java經(jīng)驗技巧》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫。
1、探究內(nèi)存泄W—Part2—分析問題-Java開發(fā)Java經(jīng)驗技巧探究內(nèi)存泄露一Part2—分析問題木文由ImportNew?黃索遠翻譯自captaindebug0歡迎加入翻譯小組。轉(zhuǎn)載請見文末要求。在這個系列的第一篇博客里,我寫了一個內(nèi)存泄露的例子。下面我們將在例子里構(gòu)建好的服務器上,探尋如何解決堆內(nèi)存泄露問題。這個例了展現(xiàn)了消費者一生產(chǎn)者模式存在的一重要問題,即消費者移除隊列的速度不能慢丁?生產(chǎn)的速度(生產(chǎn)者產(chǎn)生的單位存放在這個隊列里)。在上一篇博?客的末尾,我將例子代碼運行起來了,坐等有足夠的內(nèi)存溢出來便于探究,現(xiàn)在是吋候完成調(diào)查了。如果你看過這
2、篇博客的第一部分,就會知道在展示的內(nèi)存泄露示例代碼使用生產(chǎn)者-消費者模型創(chuàng)建了一個模擬股票交易的應用,所有的交易命令都被存入一個虛擬的數(shù)據(jù)庫中。示例代碼故意留下了一個缺陷(OrderRecord線程處理一條命令后sleep一段時間),使得OrderRecord線程消費命令的速度跟不上OrderFeed線程生產(chǎn)命令的速度。這就意味著存儲命令的隊列會變得越來越長,直到最后內(nèi)存溢出程序崩潰。問題是,如果只看我的代碼,確實能夠很輕松得看出哪里出了差錯;但是如果岀問題的代碼你從未看過并且代碼又長又復雜,加Z沒有監(jiān)控線程來幫助你觀察隊列大小或者其他內(nèi)部信息,這時
3、該怎么辦呢?下面向大家介紹分析程序內(nèi)存泄露問題的三個步驟:1.提取發(fā)牛內(nèi)存泄露的服務器的轉(zhuǎn)儲文件。2.用這個轉(zhuǎn)儲文件生成報告。3.分析生成的報告。有兒個工具能幫你生成堆轉(zhuǎn)儲文件,分別是:?jconsole?Jvisualvm?Eclipse?Memory?Analyser?Tool(MAT)用jconsole提取堆轉(zhuǎn)儲文件將jconsole關聯(lián)你的應用:單擊MBeans選項卡打開com.sun.management包,點擊HotSpotDiagnostic,點擊Operations選擇dumpHeap0這時你將會看到dumpHeap操作:它接受兩個參
4、數(shù)pO和pl。在pO的編輯框內(nèi)輸入一個堆轉(zhuǎn)儲的文件名,然后按下DumpHeap命令。用jvisualvm提取堆轉(zhuǎn)儲文件連接示例代碼,右鍵點擊你的應用,在左側(cè)的“application”窗格中選擇"Heap?Dump”。注意:如果你在發(fā)生內(nèi)存泄露的服務器上冇一個遠程連接,那么jvisualvm將會把轉(zhuǎn)出文件保存在遠程機器(假設這是一臺tmix機器)上的/tmp目錄下。你不得不將這個文件通過FTP傳送到你的機器上,然后再進行研究。用MAT來提取堆轉(zhuǎn)儲文件jconsolc和jvisualvm本身就是JDK的一部分,而MAT或者稱作“內(nèi)存分析工具”,是一個基
5、于eclipse的工具。你可以從eclipse,orgT*載。最新版木的MAT需要你在電腦上安裝JDkl.60如果你用的是Javal.7版木也不用擔心,因為它會自動為你安裝1?6版本,并且不會和安裝好了的1.7版本產(chǎn)生沖突。使用MAT的時候,只需要點擊“Aquire?Heap?Dump”,然后遵循指示就可以了。遠程連接值得注意的是,如果想要搞清楚為什么一個作為生產(chǎn)者的服務器會崩潰,那么你可能要使用JMX遠程連接。為此你需要下面的命令行選項,我從上一篇的博客中將其抄了下來:-Dcom.sun.management.jmxremote-Doom.sun.
6、management.jmxremote.port=9010-Dcom.sun.managcment.jmxremote.local,only二false-Dcom.sun.management,jmxremote.authenticate二false-Dcom.sun.management,jmxremote.ssl=false何時提取堆轉(zhuǎn)存文件這需要耗費一點心力和運氣。如果太早提取了堆轉(zhuǎn)儲文件,那么你將不能發(fā)現(xiàn)問題。因為它們被合法,非泄露類的實例屏蔽了。不過也不能等待太久,因為提取堆轉(zhuǎn)儲文件需要占用內(nèi)存,進行提取操作的時候可能會導致你的應用崩潰。
7、最好的辦法是將jconsole連接到你的應用程序并監(jiān)控堆的占用情況,知道它看起來像在崩潰的邊緣。這樣很容易就能監(jiān)控到,因為沒冇發(fā)生內(nèi)存泄霜時,三個堆部分指標都是綠色的。分析轉(zhuǎn)儲文件現(xiàn)在輪到MAT發(fā)揮作用了,因為它本身就是被設計用來分析堆轉(zhuǎn)儲文件的。要打開和分析一個堆轉(zhuǎn)儲文件,選擇File選項下的Heap?Dump選項。選擇了你要打開的文件后,你將會看到如下三個選項:選擇Leak?Suspect?Report選項。在MAT翻騰兒秒后,會生成這樣的一個頁面:如餅狀圖顯示:在示例中,疑似有一處發(fā)生了內(nèi)存泄露。也許你會想,這樣的做法只有在代碼受到控制的情況下
8、才可取。畢竟這只是個例子,這又能說明什么呢?好吧,我承認在這個例子里,所有的問題都是可見的;線程a占用了98