「说明」
本文介绍 Java 内部类持有外部类导致内存泄露的原因以及其解决方案。
「为什么内部类持有外部类会导致内存泄露?」
非静态内部类会持有外部类,如果有地方引用了这个非静态内部类,会导致外部类也被引用,垃圾回收时无法回收这个外部类(即使外部类已经没有其他地方在使用了)。
「解决方案」
不要让其他的地方持有这个非静态内部类的引用,直接在这个非静态内部类执行业务。
将非静态内部类改为静态内部类。内部类改为静态的之后,它所引用的对象或属性也必须是静态的,所以静态内部类无法获得外部对象的引用,只能从 JVM 的 Method Area(方法区)获取到static类型的引用。
为什么要持有外部类
Java 语言中,非静态内部类的主要作用有两个:
当内部类只在外部类中使用时,匿名内部类可以让外部不知道它的存在,从而减少了代码的维护工作。
当内部类持有外部类时,它就可以直接使用外部类中的变量了,这样可以很方便的完成调用,如下代码所示:
但是,静态内部类就无法持有外部类和其非静态字段了。
比如下边这样就会报错
![wKgaomRl3ciAfKSLAAC-XcDhaJ0306.jpg](https://file1.elecfans.com/web2/M00/83/98/wKgaomRl3ciAfKSLAAC-XcDhaJ0306.jpg)
报错:
![cc479778-e34f-11ed-ab56-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9B/35/wKgaomTno3yAPaG_AADLojhpf78892.png)
实例:持有外部类
「代码」
![wKgZomRl3eaAC3aAAACaTa8NwN4139.jpg](https://file1.elecfans.com/web2/M00/83/98/wKgZomRl3eaAC3aAAACaTa8NwN4139.jpg)
「断点调试」
可以看到:内部类持有外部类的对象的引用,是以“this$0”这个字段来保存的。
![cc670e96-e34f-11ed-ab56-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9B/35/wKgaomTno3yAWSEAAADipaaMkds507.png)
实例:不持有外部类
「代码」
「断点调试」
可以发现:内部类不再持有外部类了。
实例:内存泄露
「简介」
若内部类持有外部类的引用,对内部类的使用很多时,会导致外部类数目很多。此时,就算是外部类的数据没有被用到,外部类的数据所占空间也不会被释放。 本处在外部类存放大量的数据来模拟。
「代码」
「测试」
可以看到:运行了八千多次的时候就内存溢出了。
我换了一台 mac 电脑,4000 多就内存溢出了。
不会内存泄露的方案
「简介」
内部类改为静态的之后,它所引用的对象或属性也必须是静态的,所以静态内部类无法获得外部对象的引用,只能从 JVM 的 Method Area(方法区)获取到 static 类型的引用。
「代码」
「测试」
可以发现:循环了四十多万次都没有内存溢出。
审核编辑:刘清
-
JAVA语言
+关注
关注
0文章
138浏览量
20218 -
JVM
+关注
关注
0文章
158浏览量
12273
原文标题:Java 内部类有坑。。100 % 内存泄露!
文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
Executors使用不当引起的内存泄漏怎么解决
接口、内部类和Java API基础
java内部类分析详解
java内部类怎么写
![<b class='flag-5'>java</b><b class='flag-5'>内部类</b>怎么写](https://file.elecfans.com/web2/M00/49/E1/pYYBAGKhvG-AULSWAAA0_IiBCBU808.png)
java开发中遇到的难点有哪些_java开发常见的问题及解决办法
润滑油和润滑脂使用不当的几种表现
java内部类可以用public修饰吗
java内存溢出的几种原因和解决办法
M16连接器8芯使用不当会出现什么情况
![M16连接器8芯<b class='flag-5'>使用不当</b>会出现什么情况](https://file1.elecfans.com/web2/M00/C6/54/wKgaomX9JraAfrffAADMjZr3SK0688.png)
MCX射频头使用不当会出现什么情况
![MCX射频头<b class='flag-5'>使用不当</b>会出现什么情况](https://file1.elecfans.com/web2/M00/09/1A/wKgaomb2BLOAQABkAADMIykWClc762.png)
评论