1

当我们这样写时: { new A().test(); } 这个函数返回后A的内存会被gc回收(我知道可以回收,现在不能回收)。问题是,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
}

这只是一个猜想。顺便说一句,非常抱歉我的英语不好,请使用简单的语法(回答或解释),谢谢。

4

2 回答 2

0

gc 检查对象的可达性。您的对象被分配在堆上,并且对它的引用被放置在当前正在执行的方法的堆栈中,这使得 gc 可以访问它,因此它不会被收集。

当您的方法返回时,堆栈内存不再“可访问”,因此对堆中对象的单一引用消失了,因此 gc 可以自由地将其标记为收集。

您的“temp”变量只是编译器创建的那个引用的漂亮名称。

于 2013-01-30T05:29:47.953 回答
0

编译器生成字节码,以确保堆栈上有对 A 的临时引用,有点像您的示例。

于 2013-01-30T04:14:00.880 回答