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
相关产品推荐
相关产品推荐

