Java垃圾收集机制

时间:2013-01-30 03:58:36

标签: java

当我们写这样的时候:     {     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
}

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

2 个答案:

答案 0 :(得分:0)

编译器生成字节代码,确保堆栈上有A的临时引用,有点像你的例子。

答案 1 :(得分:0)

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

当你的方法返回时,堆栈内存不再“可以访问”,因此对堆中对象的单个引用就消失了,所以gc可以自由地标记它以进行收集。

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