代码如下:
public class he
{
public he()
{
test();
}
public void test()
{
for(int i=0;i<10000;i++)
{
System.out.println(i);
System.gc();
}
}
public static void main(String [] args)
{
new he();//没有它的引用
}
}
创建了一个对象,但并不保存它的引用,调用System.gc(),但是程序还是照常执行。虚拟机为什么没有回收这个对象呢?

解决方案 »

  1.   

    1. 调用 System.gc() 本来就不保证有任何结果;2. 调用 System.gc() 的时候,对象还没创建完呢(还运行在 constructor 里),怎么回收?3. 你觉得应该看见什么现象,才算回收了?
      

  2.   

    不过
    3. 你觉得应该看见什么现象,才算回收了?
    楼主的意思就是说,gc()了,he对象就不在了,那么就不会执行TEST()了...2. 调用 System.gc() 的时候,对象还没创建完呢(还运行在 constructor 里),怎么回收?
    说明一切了
      

  3.   

    但是改为如下代码,还是一样运行: 
    public class he
    {
    public he()
    {
    //test();
    System.out.println();
    }
    public void test()
    {
    for(int i=0;i<10000;i++)
    {
    System.out.println(i);
    System.gc();
    }
    }
    public static void main(String [] args)
    {
    new he().test();
    }
    }
    对象已经创建成功了阿,之后才执行函数的.
      

  4.   

    hehe, 咱们笨理核计哈,虚拟机正在执行一个对象的方法,至少虚拟机里总要保持一个对这个对象的引用吧?(或者,不说是一个引用,至少,虚拟机应该知道现在这个对象还是“有用”的,还不应该沦为“垃圾”)再者,还是那句话,你觉得应该看见什么现象,才算回收了?难道程序运行到一半突然崩掉了,才算回收成功了?不会的!GC 做的是“回收垃圾”的工作,它不会干扰普通程序的正常运行,这是最起码的要求。
      

  5.   

    我忘记了哪本书的作者说过:
      1 When you create an object of a class without a handle, somewhere in the machine, Java got to have some way to keep your object. Those works are taken care of invisibly. 
      2 I remember System.gc() doesn't ensure that it will collect these garbage.