java中非静态内部类造成内存泄漏,替换成静态为什么就不会内存泄漏

2022-06-21 00:00:00 泄漏 静态 中非

java中非静态内部类造成内存泄漏,替换成静态为什么就不会内存泄漏(面试中遇到)

首先我们知道非静态内部类会持有外部内部类的隐式引用参看

非静态内部类中线程生命周期不可控,能否正常回收完全由线程的生命周期决定。如果线程是永久运行的,那么将永远无法释放,因为在Java中线程是垃圾回收机制的根源,在运行系统中DVM虚拟机总会硬件持有所有运行状态的进程的引用,结果导致处于运行状态的线程将永远不会被回收,导致内存泄漏。

当替换成静态内部类时,就不再持有外部类的隐式引用,当然就不会导致内存泄漏,如果需要引用外部类的实例,可以显式持有一个弱引用对象或软引用对象,弱引用GC时会被GC掉,软引用对象内存不足时会被GC掉

记录一下:主要参看这两篇博客
Android 非静态内部类导致内存泄漏原因深入剖析
Handler的正确使用,使用静态内部类+弱引用,解决内存泄漏,举例说明在使用ProgressBar时的Handler类的静态内部类实现

    原文作者:ming's博客
    原文地址: https://blog.csdn.net/zhoumingazmq/article/details/112260659
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章