Ubuntu Java日志中內存泄漏的排查與解決步驟
catalina.out、application.log),尋找java.lang.OutOfMemoryError錯誤信息(如Java heap space、PermGen space、Direct buffer memory等),明確內存泄漏的類型和發生位置。top、htop、vmstat)或JDK工具(jstat -gc <pid>)實時監控Java進程的內存占用(堆內存、棧內存、直接內存)。若內存持續增長且GC無法釋放,可能存在泄漏。OutOfMemoryError時,通過jmap命令生成堆轉儲文件(記錄堆內存中所有對象的快照),命令示例:jmap -dump:format=b,file=heapdump.hprof <pid>(<pid>為Java進程ID)。若無法自動觸發,可通過-XX:+HeapDumpOnOutOfMemoryError JVM參數在OOM時自動生成。heapdump.hprof文件,重點分析:
HashMap存儲了臨時對象,導致對象無法被GC回收);static HashMap)未清空,長期持有對象;close()方法關閉;remove()方法,導致線程局部變量殘留;ConfigManager持有UserService實例,導致UserService無法回收);try-with-resources語句確保數據庫連接、文件流等資源自動關閉(如try (Connection conn = dataSource.getConnection()) { ... });clear()方法移除所有元素(如staticList.clear());finally塊中調用remove()方法(如threadLocal.remove());WeakReference)存儲非核心對象。-Xms(初始堆大?。┖?code>-Xmx(最大堆大?。┱{整堆內存(如-Xms512m -Xmx2048m),避免因堆內存不足導致頻繁OOM;-XX:+UseG1GC)或ZGC(-XX:+UseZGC)等現代垃圾回收器,提升內存回收效率(如G1GC適合大堆內存應用,可設置-XX:MaxGCPauseMillis=200控制最大GC停頓時間);-XX:MaxPermSize(永久代,Java 8前)或-XX:MaxMetaspaceSize(元空間,Java 8+);若存在直接內存泄漏,設置-XX:MaxDirectMemorySize(如-XX:MaxDirectMemorySize=512m)。