MCLzone 2022-04-29 10:58 采纳率: 0%
浏览 30

关于 Java 匿名类的引用问题

突然想到一个问题:
下面的这段代码是非常非常危险,会导致内存泄漏。当退出该 Activity 时,由于匿名内部类 Thread 持有外部类(这里的 MainActivity)的引用,导致 MainActivity 的实例对象无法被回收,从而发生内存泄漏。

我的疑问是:
JVM 的 GC 规则是看从 GC roots 能不能到达某个对象,不能到达就会在下一次 GC 时被回收,可是这里的 Thread 对象并没有显示地指向它的引用,它为什么不被回收呢?难道是有什么隐式引用存在吗?

注:由于本人水平有限,我的提问中可能本身就有不对的地方,如有不对的地方,请见谅啦~

public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_conten);
        
        new Thread(){
            @Override
            public void run() {
                try {
                    Thread.sleep(100 * 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
            }
        }.start();
        
    }
}
  • 写回答

2条回答 默认 最新

  • 不会写代码的猴子 Android领域优质创作者 2022-04-29 11:18
    关注

    这里内存泄露是因为Thread休眠了,无法被系统回收,等休眠时间过来才会被回收。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月29日

悬赏问题

  • ¥15 有人能看一下我宿舍管理系统的报修功能该怎么改啊?链表那里总是越界
  • ¥15 cs loadimage运行不了,easyx也下了,没有用
  • ¥15 r包runway详细安装教程
  • ¥15 Html中读取Json文件中数据并制作表格
  • ¥15 谁有RH342练习环境
  • ¥15 STM32F407 DMA中断问题
  • ¥15 uniapp连接阿里云无法发布消息和订阅
  • ¥25 麦当劳点餐系统代码纠错
  • ¥15 轮班监督委员会问题。
  • ¥20 关于变压器的具体案例分析