排查Java應(yīng)用內(nèi)存泄漏問(wèn)題的步驟
什么是內(nèi)存泄漏
內(nèi)存泄漏是指java應(yīng)用的堆內(nèi)存使用率持續(xù)升高,直至內(nèi)存溢出。內(nèi)存泄漏的的原因可能有多種
分配給應(yīng)用程序的內(nèi)存本身過(guò)小。而應(yīng)用的業(yè)務(wù)代碼,確實(shí)需要生成大量的對(duì)象 代碼bug,某些需要被回收的對(duì)象,由于代碼bug,卻持續(xù)的被引用,導(dǎo)致java虛擬機(jī)無(wú)法回收這些對(duì)象。從而撐爆內(nèi)存無(wú)論哪種內(nèi)存泄露,我們的解決方法都是要定位到具體是什么對(duì)象,占用了大量?jī)?nèi)存,從而方便我們基于此進(jìn)行代碼分析,debug,找出代碼問(wèn)題。而能夠幫助我們實(shí)現(xiàn)這一目的的方式就是獲取java應(yīng)用的內(nèi)存 dump
如何獲取內(nèi)存dump
使用命令獲取jcmd
首先需要獲取java 進(jìn)程id,獲取到j(luò)ava進(jìn)程后使用命令
jcmd <pid> GC.heap_dump <file-path>
如果執(zhí)行報(bào)錯(cuò)
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
一般是由于執(zhí)行jcmd的用戶同java應(yīng)用本身不是同一個(gè)用戶。解決辦法是切換到應(yīng)用對(duì)應(yīng)的用戶下再執(zhí)行上述命令
sudo -u [userid] /jcmd <pid> GC.heap_dump <file-path>
如果應(yīng)用在本地
如果應(yīng)用是在本地,除了用上述方法外,還可以用JVisualVM 、JConsole
程序異常退出時(shí)自動(dòng)dump
但更為重要的,為了準(zhǔn)確還原應(yīng)用故障的現(xiàn)場(chǎng),最好通過(guò)指定java 執(zhí)行參數(shù),在程序出錯(cuò)時(shí),自動(dòng)dump
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<file-or-dir-path>
如何分析內(nèi)存dump
獲取到dump文件后,需要使用eclipse.org 出品的 Memory Analyzer 工具。使用其中的Dominator Tree,查看各對(duì)象的內(nèi)存占用情況
找出占用內(nèi)存最多的對(duì)象及其類信息
以上就是排查Java應(yīng)用內(nèi)存泄漏問(wèn)題的步驟的詳細(xì)內(nèi)容,更多關(guān)于Java應(yīng)用內(nèi)存泄漏的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. Python如何批量生成和調(diào)用變量2. ASP.NET MVC實(shí)現(xiàn)橫向展示購(gòu)物車3. ASP.Net Core對(duì)USB攝像頭進(jìn)行截圖4. .net如何優(yōu)雅的使用EFCore實(shí)例詳解5. ASP.Net Core(C#)創(chuàng)建Web站點(diǎn)的實(shí)現(xiàn)6. python 爬取京東指定商品評(píng)論并進(jìn)行情感分析7. python基礎(chǔ)之匿名函數(shù)詳解8. Python獲取B站粉絲數(shù)的示例代碼9. ajax動(dòng)態(tài)加載json數(shù)據(jù)并詳細(xì)解析10. 通過(guò)CSS數(shù)學(xué)函數(shù)實(shí)現(xiàn)動(dòng)畫(huà)特效
