Java 内存泄漏原因(长生命周期的对象持有短生命周期对象的引用、未正确关闭资源等)
2026/9/14 19:13:35 网站建设 项目流程

Java 内存泄漏原因

  1. 长生命周期的对象持有短生命周期对象的引用:例如,静态集合不断添加对象而不清理
privatestaticfinalList<byte[]>cache=newArrayList<>();voidadd(){cache.add(newbyte[1024*1024]);}
  1. 未正确关闭资源:例如,数据库连接、文件流、网络连接未关闭
FileInputStreamfileInputStream=null;try{fileInputStream=newFileInputStream("target.txt");}catch(IOExceptione){e.printStackTrace();}
  1. 内部类持有外部类引用:非静态内部类持有外部类实例,若内部类生命周期更长,会导致外部类无法释放
publicclassOuter{privateStringvalue="Outer";classInner{voidprint(){System.out.println(value);}@Overrideprotectedvoidfinalize()throwsThrowable{System.out.println("Inner 对象被回收");super.finalize();}}@Overrideprotectedvoidfinalize()throwsThrowable{System.out.println("Outer 对象被回收");super.finalize();}}
publicclassTest{publicstaticvoidmain(String[]args){Outerouter=newOuter();Outer.Innerinner=outer.newInner();inner.print();System.out.println("----- outer 被设置为 null");outer=null;System.gc();try{Thread.sleep(10*1000);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("----- inner 被设置为 null");inner=null;System.gc();try{Thread.sleep(10*1000);}catch(InterruptedExceptione){e.printStackTrace();}}}
# 输出结果 Outer ----- outer 被设置为 null ----- inner 被设置为 null Inner 对象被回收 Outer 对象被回收
  1. 不合理的作用域:将局部变量提升为静态变量,意外延长对象生命周期

  2. 监听器或回调未注销:注册了监听器或回调,但是缺少移除方法

  3. ThreadLocal 使用不当:例如,线程池的线程复用时,ThreadLocal 未及时调用 remove 方法,导致数据残留

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询