Java 内存泄漏原因(长生命周期的对象持有短生命周期对象的引用、未正确关闭资源等)

Java 内存泄漏原因

  1. 长生命周期的对象持有短生命周期对象的引用:例如,静态集合不断添加对象而不清理
java 复制代码
private static final List<byte[]> cache = new ArrayList<>();

void add() {
    cache.add(new byte[1024 * 1024]);
}
  1. 未正确关闭资源:例如,数据库连接、文件流、网络连接未关闭
java 复制代码
FileInputStream fileInputStream = null;
try {
    fileInputStream = new FileInputStream("target.txt");
} catch (IOException e) {
    e.printStackTrace();
}
  1. 内部类持有外部类引用:非静态内部类持有外部类实例,若内部类生命周期更长,会导致外部类无法释放
java 复制代码
public class Outer {
    private String value = "Outer";

    class Inner {
        void print() {
            System.out.println(value);
        }

        @Override
        protected void finalize() throws Throwable {
            System.out.println("Inner 对象被回收");
            super.finalize();
        }
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("Outer 对象被回收");
        super.finalize();
    }
}
java 复制代码
public class Test {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.print();

        System.out.println("----- outer 被设置为 null");

        outer = null;
        System.gc();
        try {
            Thread.sleep(10 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("----- inner 被设置为 null");

        inner = null;
        System.gc();
        try {
            Thread.sleep(10 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
复制代码
# 输出结果

Outer
----- outer 被设置为 null
----- inner 被设置为 null
Inner 对象被回收
Outer 对象被回收
  1. 不合理的作用域:将局部变量提升为静态变量,意外延长对象生命周期

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

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

相关推荐
摇滚侠3 分钟前
IDEA 新建 JavaWeb 项目 Tomcat 和 Servlet
java·ide·intellij-idea
码客日记14 分钟前
Spring Boot 全局跨域配置与前后端联调避坑
java·spring boot·后端
键盘上的猫头鹰14 分钟前
【Linux 基础教程(四)】文件内容查看、打包压缩与搜索、重定向管道及环境变量
linux·服务器·python
FenceRain18 分钟前
Nginx 升级,平滑升级不停服务
服务器·网络·nginx
tellmewhoisi22 分钟前
linux 基础知识(文件权限相关)
linux·运维·服务器
jiayong2329 分钟前
Claude Code 常见操作实战指南
linux·服务器·网络·ai·claude·claude code
兰令水32 分钟前
leecodecode【回溯子集】【2026.6.4打卡-java版本】
java·开发语言·深度优先
fox_lht33 分钟前
14.3.重构
开发语言·后端·rust
神奇小汤圆39 分钟前
Java技术栈Skills全景指南
后端
醇氧1 小时前
【Linux 】sudo、sudo -i、su、su - 完整区别总结
linux·运维·服务器