当前位置:
编程学堂 > 小心避免陷阱, Java内部类持有外部类会导致内存泄漏
小心避免陷阱, Java内部类持有外部类会导致内存泄漏
简介
使用说明
本文介绍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);
}
}
报错:
来源|www.sychzs.cn/feiying0canglang/article/details/121108201
打造优质技术交流社区。欢迎从事编程开发、技术招聘的HR加入。也欢迎大家分享自己公司的内部信息,互相帮助,共同进步!