排查Java應(yīng)用內(nèi)存泄漏問題的步驟
什么是內(nèi)存泄漏
內(nèi)存泄漏是指java應(yīng)用的堆內(nèi)存使用率持續(xù)升高,直至內(nèi)存溢出。
內(nèi)存泄漏的的原因可能有多種
- 分配給應(yīng)用程序的內(nèi)存本身過小。而應(yīng)用的業(yè)務(wù)代碼,確實(shí)需要生成大量的對象
- 代碼bug,某些需要被回收的對象,由于代碼bug,卻持續(xù)的被引用,導(dǎo)致java虛擬機(jī)無法回收這些對象。從而撐爆內(nèi)存
無論哪種內(nèi)存泄露,我們的解決方法都是要定位到具體是什么對象,占用了大量內(nèi)存,從而方便我們基于此進(jìn)行代碼分析,debug,找出代碼問題。
而能夠幫助我們實(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)錯
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
一般是由于執(zhí)行jcmd的用戶同java應(yīng)用本身不是同一個用戶。解決辦法是切換到應(yīng)用對應(yīng)的用戶下再執(zhí)行上述命令
sudo -u [userid] /jcmd <pid> GC.heap_dump <file-path>
如果應(yīng)用在本地
如果應(yīng)用是在本地,除了用上述方法外,還可以用JVisualVM 、JConsole
程序異常退出時自動dump
但更為重要的,為了準(zhǔn)確還原應(yīng)用故障的現(xiàn)場,最好通過指定java 執(zhí)行參數(shù),在程序出錯時,自動dump
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<file-or-dir-path>
如何分析內(nèi)存dump
獲取到dump文件后,需要使用eclipse.org 出品的 Memory Analyzer 工具。使用其中的Dominator Tree,查看各對象的內(nèi)存占用情況
找出占用內(nèi)存最多的對象及其類信息
以上就是排查Java應(yīng)用內(nèi)存泄漏問題的步驟的詳細(xì)內(nèi)容,更多關(guān)于Java應(yīng)用內(nèi)存泄漏的資料請關(guān)注腳本之家其它相關(guān)文章!
- Java基礎(chǔ)詳解之內(nèi)存泄漏
- Java中的內(nèi)存泄漏
- Java內(nèi)部類的實(shí)現(xiàn)原理與可能的內(nèi)存泄漏說明
- macOS上使用gperftools定位Java內(nèi)存泄漏問題及解決方案
- Java虛擬機(jī)內(nèi)存溢出與內(nèi)存泄漏
- 簡單了解JAVA內(nèi)存泄漏和溢出區(qū)別及聯(lián)系
- java內(nèi)存泄漏與內(nèi)存溢出關(guān)系解析
- 一次 Java 內(nèi)存泄漏的排查解決過程詳解
- Java基礎(chǔ)之堆內(nèi)存溢出的解決
- Java 內(nèi)存溢出的原因和解決方法
- Java虛擬機(jī)常見內(nèi)存溢出錯誤匯總
- JAVA 內(nèi)存溢出案例匯總
- Java內(nèi)存溢出實(shí)現(xiàn)原因及解決方案
- JAVA內(nèi)存溢出解決方案圖解
- Java基礎(chǔ)之內(nèi)存泄漏與溢出詳解
相關(guān)文章
一文探索Apache HttpClient如何設(shè)定超時時間
Apache HttpClient是一個流行的Java庫,用于發(fā)送HTTP請求,這篇文章主要為大家介紹了Apache HttpClient如何設(shè)定超時時間,感興趣的小伙伴可以學(xué)習(xí)一下2023-10-10Java實(shí)現(xiàn)飛機(jī)航班管理系統(tǒng)的思路詳解
這篇文章主要介紹了Java實(shí)現(xiàn)飛機(jī)航班管理系統(tǒng)的思路詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07Java8簡單了解Lambda表達(dá)式與函數(shù)式接口
這篇文章主要介紹了Java8簡單了解Lambda表達(dá)式與函數(shù)式接口,具有一定參考價值,需要的朋友可以了解下。2017-11-11運(yùn)行Jar包出現(xiàn)提示xxx中沒有主清單屬性報(bào)錯問題解決方法
這篇文章主要介紹了運(yùn)行Jar包出現(xiàn):xxx中沒有主清單屬性報(bào)錯,當(dāng)出現(xiàn)報(bào)錯:xxx中沒有主清單屬性,解決方法也很簡單,在pom.xml配置中,加上相應(yīng)配置即可,需要的朋友可以參考下2023-08-08關(guān)于SpringBoot簡介、官網(wǎng)構(gòu)建、快速啟動的問題
SpringBoot 是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來簡化Spring應(yīng)用的初始搭建以及開發(fā)過程,這篇文章主要介紹了SpringBoot簡介、官網(wǎng)構(gòu)建、快速啟動,需要的朋友可以參考下2022-07-07mybatis 忽略實(shí)體對象的某個屬性(2種方式)
這篇文章主要介紹了mybatis 忽略實(shí)體對象的某個屬性方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06mybatis-plus常用注解@TableId和@TableField的用法
本文主要介紹了mybatis-plus常用注解@TableId和@TableField的用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04JAVA項(xiàng)目如何打包部署到Linux服務(wù)器上
本文詳細(xì)介紹了在服務(wù)器上部署環(huán)境包括JDK、MySQL、Tomcat的設(shè)置,以及使用Idea-Maven-SpringBoot進(jìn)行jar包打包部署的流程,內(nèi)容涵蓋了MySQL配置注意事項(xiàng)、pom.xml配置、打包命令等關(guān)鍵步驟,同時,也提供了如何將jar包上傳到Linux服務(wù)器并運(yùn)行的具體方法2024-10-10