java內(nèi)存泄漏排查過程及解決
最近公司生產(chǎn)環(huán)境里面一個服務(wù)的一直在上升,過一段時間就要觸發(fā)報警,重啟也只能暫時緩解,由于還沒有OOM,猜測可能是內(nèi)存泄漏了。
內(nèi)存泄漏
內(nèi)存泄漏是Java應(yīng)用中常見的問題,指對象已經(jīng)不再被使用,但由于被意外引用而無法被垃圾回收器(GC)回收,導(dǎo)致內(nèi)存占用持續(xù)增長,最終可能引發(fā)OOM(OutOfMemoryError)錯誤。
內(nèi)存問題排查
還是采用常規(guī)的辦法,八股文面試必問。
1.查看JVM內(nèi)存配置
查看內(nèi)存中對象的數(shù)量和大小,判斷是否在合理的范圍,如果在合理的范圍內(nèi),增大內(nèi)存配置,調(diào)整內(nèi)存比例就可以了。
查詢一下那個服務(wù)的pid進(jìn)程號,根據(jù)進(jìn)程號查詢。
jmap -heap pid

可以看出 老年代的使用率已經(jīng)非常高了。
2.分析gc是否正常執(zhí)行
jstat -gcutil 1000

S0 — Heap上的 Survivor space 0 區(qū)已使用空間的百分比 S1 — Heap上的 Survivor space 1 區(qū)已使用空間的百分比 E — Heap上的 Eden space 區(qū)已使用空間的百分比 O — Heap上的 Old space 區(qū)已使用空間的百分比 M — 元空間 區(qū)已使用空間的百分比 YGC — 從應(yīng)用程序啟動到采樣時發(fā)生 Young GC 的次數(shù) YGCT– 從應(yīng)用程序啟動到采樣時 Young GC 所用的時間(單位秒) FGC — 從應(yīng)用程序啟動到采樣時發(fā)生 Full GC 的次數(shù) FGCT– 從應(yīng)用程序啟動到采樣時 Full GC 所用的時間(單位秒) GCT — 從應(yīng)用程序啟動到采樣時用于垃圾回收的總時間(單位秒) LGCC - 進(jìn)行GC的原因(低版本jdk可能沒有這一列)
3.導(dǎo)出 dump 各種工具分析
以文件方式導(dǎo)出 jvm 內(nèi)存使用情況:
jmap -dump:live,format=b,file=xxxx.hprof pid


4.工具分析dump
jvm 分析工具有很多,我這里使用idea自帶的小儀表盤,無需單獨下載,可以直接使用,小儀表盤的名字叫Profiler,功能比較強大,最好使用idea2023以后的版本。

打開dump 文件:

打開后頁面如下:

查找一下大對象:

快速找出耗內(nèi)存大對象:


根據(jù)大對象直接定位到具體的代碼:


總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot 自定義異常并捕獲異常返給前端的實現(xiàn)代碼
在開發(fā)中,如果用try catch的方式,每個方法都需要單獨實現(xiàn),為了方便分類異常,返回給前端,采用了@ControllerAdvice注解和繼承了RuntimeException的方式來實現(xiàn),具體實現(xiàn)內(nèi)容跟隨小編一起看看吧2021-11-11
MyBatis實現(xiàn)表連接查詢寫法(三種對應(yīng)關(guān)系)的方法總結(jié)
這篇文章主要介紹了MyBatis實現(xiàn)表連接查詢寫法(一對一關(guān)系、一對多關(guān)系、多對多關(guān)系)的方法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-01-01
spring boot+vue 的前后端分離與合并方案實例詳解
這篇文章主要介紹了spring boot+vue 的前后端分離與合并方案實例詳解,需要的朋友可以參考下2017-11-11
Spring Cloud Consul實現(xiàn)選舉機(jī)制的代碼工程
Spring Cloud Consul 是 Spring Cloud 提供的對 HashiCorp Consul 的支持,它是一種基于服務(wù)網(wǎng)格的工具,用于實現(xiàn)服務(wù)注冊、發(fā)現(xiàn)、配置管理和健康檢查,本文給大家介紹了如何用Spring Cloud Consul實現(xiàn)選舉機(jī)制,需要的朋友可以參考下2024-11-11
淺談SpringBoot在使用測試的時候是否需要@RunWith
本文主要介紹了淺談SpringBoot在使用測試的時候是否需要@RunWith,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
springboot打包不同環(huán)境配置以及shell腳本部署的方法
這篇文章主要給大家介紹了關(guān)于springboot打包不同環(huán)境配置以及shell腳本部署的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用springboot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Springboot?多級緩存設(shè)計與實現(xiàn)方案
多級緩存是提升高并發(fā)系統(tǒng)性能的關(guān)鍵策略之一,它不僅能夠減少系統(tǒng)的響應(yīng)時間,提高用戶體驗,還能有效降低后端系統(tǒng)的負(fù)載,防止系統(tǒng)過載,這篇文章主要介紹了Springboot?多級緩存設(shè)計與實現(xiàn),需要的朋友可以參考下2024-02-02

