既然你已經(jīng)知道你的程序有內(nèi)存泄漏,那么當(dāng)泄漏成為問(wèn)題時(shí),你可以使用這些工具來(lái)幫助修復(fù)泄漏——最好是在泄漏成為問(wèn)題之前。很多人都選擇參加java培訓(xùn)來(lái)獲得更全面的學(xué)習(xí),有專業(yè)老師教學(xué)指導(dǎo),理論知識(shí)+實(shí)戰(zhàn)項(xiàng)目一起學(xué)習(xí),可以快速提升自己。
使用可以檢測(cè)內(nèi)存泄漏的工具
對(duì)于我們的下一個(gè)例子,我們將使用VisualVM。
下載并配置VisualVM后,通過(guò)運(yùn)行附加了VisualVM的應(yīng)用程序來(lái)分析你的代碼。當(dāng)執(zhí)行降低應(yīng)用程序速度的任務(wù)時(shí),VisualVM會(huì)查看“監(jiān)視器”和“內(nèi)存池”選項(xiàng)卡。你需要注意什么?當(dāng)你在Monitor選項(xiàng)卡中看到內(nèi)存使用高峰時(shí),按下“Perform GC”按鈕,這將激活垃圾收集。這應(yīng)該有助于減少使用的內(nèi)存量。
如果這不起作用,切換到“內(nèi)存池”并查看舊的Gen部分。如果有物體泄漏,你會(huì)在這里看到。請(qǐng)記住,活動(dòng)對(duì)象被放置在“伊甸園”,然后將被移動(dòng)到“幸存者”。同時(shí),在“老一代”池中發(fā)現(xiàn)較老的對(duì)象。
在這一點(diǎn)上,你可以回到你的代碼并注釋掉不相關(guān)的部分,直到你注意到有性能下降或停止的地方。重復(fù)所有這些步驟,直到消除所有泄漏。如果你正在考慮如何快速學(xué)習(xí)java,那么參加java培訓(xùn)掌握更全面的知識(shí)和技能將是一個(gè)很好的開(kāi)始。
啟用代碼的某些部分來(lái)檢查內(nèi)存使用情況,如果你發(fā)現(xiàn)另一個(gè)泄漏,進(jìn)入導(dǎo)致這些泄漏的方法來(lái)幫助堵塞它。繼續(xù)縮小范圍,直到只剩下一個(gè)類或方法。驗(yàn)證所有文件緩沖區(qū),看它們是否關(guān)閉。另外,檢查所有的散列表,看看你是否正確地使用了它們。
使用堆轉(zhuǎn)儲(chǔ)
如果你覺(jué)得上面提到的方法太單調(diào)乏味,你可以通過(guò)使用堆轉(zhuǎn)儲(chǔ)來(lái)減少修復(fù)內(nèi)存泄漏所花費(fèi)的時(shí)間。堆轉(zhuǎn)儲(chǔ)允許你查看打開(kāi)的實(shí)例數(shù)量以及這些實(shí)例占用了多少空間。如果你想進(jìn)一步調(diào)查某個(gè)特定的實(shí)例,只需雙擊該特定的實(shí)例就可以看到更多信息。堆轉(zhuǎn)儲(chǔ)幫助你了解應(yīng)用程序生成了多少對(duì)象。在java培訓(xùn)中,無(wú)論是理論知識(shí),還是實(shí)戰(zhàn)項(xiàng)目,都是緊跟市場(chǎng)和企業(yè)需求的,讓你掌握最新技術(shù),走在市場(chǎng)前沿。
使用Eclipse內(nèi)存泄漏警告
另一種節(jié)省時(shí)間的方法是依靠Eclipse內(nèi)存泄漏警告。如果你有符合JDK 1.5或更高版本的代碼,你可以使用Eclipse在引用結(jié)束但對(duì)象持續(xù)存在且未關(guān)閉時(shí)發(fā)出警告。請(qǐng)確保在項(xiàng)目設(shè)置中啟用泄漏檢測(cè)。
請(qǐng)注意,使用Eclipse可能不是一個(gè)全面的解決方案。Eclipse不能檢測(cè)所有的泄漏,可能會(huì)遺漏一些文件閉包,尤其是當(dāng)你的代碼不符合JDK 1.5(或更高版本)時(shí)。Eclipse不總是工作的另一個(gè)原因是因?yàn)檫@些文件的關(guān)閉和打開(kāi)嵌套得非常深。
總結(jié)
內(nèi)存泄漏當(dāng)然是Java開(kāi)發(fā)人員的一個(gè)擔(dān)憂,但它們并不總是世界末日。用專業(yè)知識(shí)武裝自己,在問(wèn)題發(fā)生之前就加以預(yù)防,并在問(wèn)題出現(xiàn)時(shí)加以解決。想學(xué)習(xí)java的同學(xué)建議通過(guò)參加java培訓(xùn)來(lái)提升自己,在專業(yè)老師的指導(dǎo)下,可以獲得很大進(jìn)步。