当我们写这样的时候: { new A()。test(); } 在此函数返回后,将通过gc收集A的记忆(我知道它可能用于收集,而不是立即收集)。问题是,jvm如何确保在test()排除期间不会实现A的记忆(我假设gc是一个独立的线程)。我以为编译器可能会将语句改为:
{
//cover it in a scope
{
A temp = new A();
temp.test();
}
//outside the scope, temp is no longer stay in stack, so that A's memory can be colllected
}
这只是一个猜想。 顺便说一句,非常抱歉我的英语不好,请使用简单的语法(回答或解释),谢谢。
答案 0 :(得分:0)
编译器生成字节代码,确保堆栈上有A的临时引用,有点像你的例子。
答案 1 :(得分:0)
gc检查对象的可达性。您的对象在堆上分配,对它的引用放在正在执行的当前方法的堆栈上,这使得它可以被gc访问,因此不会被收集。
当你的方法返回时,堆栈内存不再“可以访问”,因此对堆中对象的单个引用就消失了,所以gc可以自由地标记它以进行收集。
你的“temp”变量只是编译器创建的那个引用的漂亮名称。