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(初始堆大小)和-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)。