You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中实例变量闭包是否会阻止对象被垃圾回收?

引用实例变量对对象存活的影响与垃圾回收判定

核心结论

  • 引用实例变量会让外部类对象保持存活:当内部类(包括lambda表达式)引用外部类的实例变量时,会隐式持有外部类对象的引用,只要内部类对象还处于可达状态,外部类对象就不会被垃圾回收。
  • 对象只有在完全不可达(没有任何活跃引用指向它)的情况下,才会被判定为可回收对象。

结合代码分析

来看你提供的代码:

public class State {
    private int x = 10;
    
    Runnable runnable() {
        return () -> System.out.println(x);
    }
    
    public static void main(String[] args) {
       State state = new State();
       Runnable runnable = state.runnable();
       state = null;
       // 此处`state`对象是否符合垃圾回收条件?
       runnable.run();
    }
}

在main方法中,虽然把state变量置为null,但之前创建的Runnable对象(lambda表达式)捕获了State类的实例变量x——这意味着这个Runnable对象会隐式持有State实例的引用。此时Runnable对象仍然是可达的(有runnable变量指向它),所以对应的State对象并没有完全不可达,不符合垃圾回收条件。

后续调用runnable.run()能正常打印10,也能佐证这一点:如果State对象已经被回收,访问它的实例变量x会引发错误,但实际运行正常,说明对象仍处于存活状态。

内容的提问来源于stack exchange,提问作者petabyte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:02:12