在Ubuntu上排查Java內存泄漏可按以下步驟進行:
- 監控內存使用
- 用
top或htop命令觀察Java進程內存是否持續上升。
- 通過
jstat -gc <pid>監控GC情況,查看老年代內存占用及Full GC頻率。
- 生成堆轉儲文件
- 使用
jmap -dump:live,format=b,file=heapdump.hprof <pid>生成堆轉儲文件。
- 分析堆轉儲文件
- 用Eclipse MAT或VisualVM打開堆轉儲文件,查看內存占用高的對象及引用鏈,重點關注靜態集合、緩存、線程局部變量(ThreadLocal)等。
- 代碼審查
- 檢查靜態集合是否未清理、資源(如數據庫連接、文件流)是否未關閉、監聽器是否未注銷。
- 確保ThreadLocal使用后調用
remove()方法。
- 調整JVM參數
- 優化堆內存大?。?code>-Xms和
-Xmx)及垃圾回收器(如使用G1 GC:-XX:UseG1GC)。
- 壓力測試與驗證
- 通過工具(如JMeter)模擬高負載,觀察內存是否持續增長,驗證修復效果。
常用工具:
- 命令行:
jstat、jmap、jcmd。
- 圖形化:VisualVM、Eclipse MAT、JProfiler。
參考來源: