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

GC执行时机疑问:return返回对象后未入栈时如何判定引用?

GC如何识别未赋值到局部变量的返回对象?

先看你给出的代码:

public static void main(String[] args) {
   Object ref = this.returnRef();
}

public Object returnRef() {
   return new Object();
}

当returnRef()执行到return new Object()这一步时,JVM会先把新创建的对象引用压入当前方法栈帧的操作数栈,之后才会执行返回逻辑。哪怕此时GC立刻触发,main里的ref还没完成赋值,但这个对象的引用并没有消失——它要么在returnRef()的操作数栈里,要么在返回过程中被暂存到调用方(main)的操作数栈或者寄存器中。

GC判断对象是否存活的根搜索(GC Roots)范围,可不只是栈帧里已经赋值的局部变量,还包括:

  • 所有活跃栈帧的操作数栈里的引用
  • CPU寄存器中暂存的引用
  • 方法区里的静态变量、常量引用等

所以这个场景下,新对象的引用属于GC Roots能触及的范围,GC会判定它是被引用状态,不会被回收。等后续这个引用被赋值到main的ref变量后,引用的位置转移到main的局部变量表,但只要还在可达链上,就不会被回收。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:52:04