当前位置:编程学堂 > 小心避免陷阱, Java内部类持有外部类会导致内存泄漏

小心避免陷阱, Java内部类持有外部类会导致内存泄漏

  • 发布:2023-09-29 21:55

简介

使用说明

本文介绍java内部类持有外部类导致内存泄漏的原因及其解决方案。

为什么内部类持有外部类导致内存泄漏

非静态内部类将保存外部类。如果某个地方引用了这个非静态内部类,那么外部类也会被引用。这个外部类在垃圾回收期间无法被回收(即使该外部类在其他地方不再使用)。

解决方案

不要让其他地方持有这个非静态内部类的引用,直接在这个非静态内部类中进行业务。

将非静态内部类更改为静态内部类。内部类改为静态后,其引用的对象或属性也必须是静态的,因此静态内部类无法获取外部对象的引用,只能从JVM的方法区获取静态类型引用。

为什么要办课外班

Java 在语言中,非静态内部类主要有两个作用:

  • 当内部类仅在外部类中使用时,匿名内部类可以让外部不知道它的存在,从而减少代码维护工作。

  • 当内部类持有外部类时,可以直接使用外部类中的变量,这样就可以非常方便的完成调用,如下代码所示:

 org.example.a;

 {
    private 字符串外部名称= “托尼” ;

     内部{
        私人  字符串名称;

        公共 内部( ) {
            这个.name = outerName;
        }
    }

    内部createInner() {
        返回 newInner();
    }
}

公共  演示 {
    公共 静态  void main(字符串[] args) 
{
        Outer.Inner inner = new Outer().createInner();
        System.out.println(inner);     }
}

但是,静态内部类就无法持有外部类及其非静态字段了。比如下边这样报错

 org.example.a;

 {
    private 字符串外部名称= “托尼” ;

    静态  {
        私有 字符串名称;

        公共 () {
            这个.name = outerName;
        }
    }

    内部createInner() {
        返回 新  内部();
    }
}

公共 班级 演示 {
    公共  静态 void main(字符串[] args) 
{
        Outer.Inner inner = newOuter().createInner();         System.out.println(inner);
    }
}

报错