原文网址:Java内存泄露系列--内部类持有外部类导致内存泄露--原因/解决方案_IT利刃出鞘的博客-CSDN博客

简介

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

为什么内部类持有外部类会导致内存泄露?

非静态内部类会持有外部类,如果有地方引用了这个非静态内部类,会导致外部类也被引用,垃圾回收时无法回收这个外部类(即使外部类已经没有其他地方在使用了)。

解决方案

  1. 不要让其他的地方持有这个非静态内部类的引用,直接在这个非静态内部类执行业务。
  2. 将非静态内部类改为静态内部类。
    1. 内部类改为静态的之后,它所引用的对象或属性也必须是静态的,所以静态内部类无法获得外部对象的引用,只能从 JVM 的 Method Area(方法区)获取到static类型的引用。

相关网址

匿名内部类的内存泄露:Java--匿名内部类导致内存泄露的原因和解决方案 - 自学精灵

为什么要持有外部类

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

  1. 当内部类只在外部类中使用时,匿名内部类可以让外部不知道它的存在,从而减少了代码的维护工作。
  2. 当内部类持有外部类时,它就可以直接使用外部类中的变量了,这样可以很方便的完成调用,如下代码所示:
package org.example.a;class Outer{private String outerName = "Tony";class Inner{private String name;public Inner() {this.name = outerName;}}Inner createInner() {return new Inner();}
}public class Demo {public static void main(String[] args) {Outer.Inner inner = new Outer().createInner();System.out.println(inner);}
}

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

package org.example.a;class Outer{private String outerName = "Tony";static class Inner{private String name;public Inner() {this.name = outerName;}}Inner createInner() {return new Inner();}
}public class Demo {public static void main(String[] args) {Outer.Inner inner = new Outer().createInner();System.out.println(inner);}
}

报错:

实例:持有外部类

上边是文章的部分内容,为便于维护,全文已迁移到此网址:Java-内部类持有外部类导致内存泄露的原因和解决方案 - 自学精灵

Java内存泄露系列--内部类持有外部类导致内存泄露--原因/解决方案相关推荐

  1. java内部类gc_Java内部类持有外部类的引用详细分析与解决方案

    在Java中内部类的定义与使用一般为成员内部类与匿名内部类,他们的对象都会隐式持有外部类对象的引用,影响外部类对象的回收. GC只会回收没有被引用或者根集不可到达的对象(取决于GC算法),内部类在生命 ...

  2. java内部类为什么会持有外部类的引用_为什么内部类持有外部类的引?

    对普通类(没有内部类的类)来说,内部类和外部类都与他无关:对有内部类的类来说,它们就是其内部类的外部类,外部类是个相对的说法,其实就是有内部类的类.所以,要回答这个问题,只需要讲解内部类是什么:Jav ...

  3. java内部类为什么会持有外部类的引用_java中内部类为什么会持有外部类的引用?...

    当我们分析内存泄漏的场景时,总会想到不能在内部类中做耗时操作,因为它会持有外部类的因为,导致外部类的实例在生命周期结束的时候没有办法及时释放,这就造成了内存泄漏. 好像这就是一个公理一样,就是人们说着 ...

  4. JAVA基础系列:内部类获取外部类的成员变量

    内部类获取外部类的成员变量,使用 外部类类名.this.变量名 的形式获取 public class Outer {public String name = "outer";cla ...

  5. Java内部类、外部类之间访问权限

    Java内部类.外部类之间访问权限 啥是内部类 内部类可以访问外部类的所有成员吗 那外部类能访问内部类的所有成员吗 匿名内部类 静态内部类呢 为啥会这样呢 得出结论 啥是内部类 顾名思义,内部类就是在 ...

  6. Java内部类引用外部类中的局部变量为何必须是final问题解析

    Java内部类引用外部类中的局部变量为何必须是final问题解析 今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来 ...

  7. java内部类与外部类

    java内部类与外部类 java内部类与外部类 一.内部类的作用 二.内部类分类 一.成员内部类 1.非静态内部类 2.静态内部类 二.局部内部类 三.匿名内部类(重要) java内部类与外部类 概念 ...

  8. java的内部类和外部类_java内部类 和外部类的区别

    下面说一说内部类(Inner Class)和静态内部类(Static Nested Class)的区别: 定义在一个类内部的类叫内部类,包含内部类的类称为外部类.内部类可以声明public.prote ...

  9. 内部类与外部类之间的访问

    目           录 1.内部类与外部类 2.内部类的特点:内部类可以直接访问外部类的成员(成员变量和成员方法),包括私有成员. 3.内部类与外部类之间的访问 在测试类中调用成员内部类中的方法: ...

最新文章

  1. 创建MySQL数据库
  2. 基于SSM实现网上购物商城系统
  3. 链表表示八进制加法c语言,用单链表实现八进制加法操作,恳请大家看看Add( )函数的问题...
  4. 打印图片预览时图片显示不出来_办公小技巧:深入挖掘实用的Excel打印秘诀
  5. CF388D-Fox and Perfect Sets【dp,线性基】
  6. spring security:自定义认证成功处理器
  7. 策略模式在公司项目中的运用实践,看完又可以涨一波实战经验了!
  8. linux内核那些事之Memory protection keys(硬件原理)
  9. 系列:关于TXT的文件格式
  10. android app 嵌入广告,流氓来了!如何拯救手机中嵌入广告的应用
  11. Arcpy ERROR 999999: 执行函数时出错解决方法
  12. 20190321——Python模块
  13. 最详细最容易理解的HMM文章
  14. python爬虫20 | 小帅b教你如何使用python识别图片验证码
  15. [ctfhub]刷题记录
  16. spring知识体系
  17. 企业网络营销信息源类别及传递渠道调查
  18. layui实现导出全部数据Excel
  19. 区块链挑战传统支付体系
  20. 企业微信如何提高用户粘性防止粉丝流失

热门文章

  1. python列表和数组区别java_浅谈numpy中np.array()与np.asarray的区别以及.tolist
  2. Tlink物联网平台使用(四)
  3. 写一个函数,输入一个十六进制数,输出相应的十进制数。
  4. br,hr和img标签
  5. sql判断时间段是否重叠
  6. 【力扣刷题总结】数据库题目按知识点分类总结
  7. L1范数 L2范数
  8. 跑步用什么蓝牙耳机好?2022跑步运动蓝牙耳机推荐
  9. 微信支付 php详解,微信支付之公众号支付详解
  10. 梦想CAD控件安卓参数绘图