不是说java垃圾回收是对象没引用指针了就可以当垃圾清理了吗,那么
(new JFrame()).setVisible(true);
System.gc();后怎么不把窗体回收了?
如果不setVisible(true);再调用System.gc();会不会清理?还有new Thread(new Runnable{public void run(){...}});
也是没引用
调用System.gc()垃圾回收会不会把这个线程kill了?谢谢高手解答!!^_^

解决方案 »

  1.   

    java的垃圾回收机制对于线程、socket等这些资源,不仅会检查引用计数,还要进行其它的检查。
      

  2.   

    當線程終止或窗體關閉後將處於可回收狀態,至於什麼時候回收不同的JVM不同
      

  3.   

    (new JFrame()).setVisible(true); 
    这句并没有释放JFrame的引用,应该dispose一把释放才行。而对于线程来说,必须是没有引用并且isAlive()为false的时候才能被gc收集
      

  4.   

    即使System.gc();了垃圾回收器也是未必工作的
      

  5.   

    import javax.swing.JFrame;public class Test extends JFrame
    { Test()
    {
    setSize(600,400);
    //setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    @Override
    protected void finalize()
    {

    System.out.println("回收");
    } public static void main(String[] args)
    {
    new Test();
    System.gc();
    }
    }
    从结果可以看出 如果不调用setVisible()方法 
    就要被清理 调用了就不被清理
    不知道是啥原因
      

  6.   

    调用了System.gc()方法不一定立刻就回收没有引用指向的资源,可能会过一段不确定的时间在回收,这个时间的长短和jvm的实现以及目标机器的内存使用有关.
      

  7.   

    (new JFrame()).setVisible(true); 
    这句并没有释放JFrame的引用,应该dispose一把释放才行。 而对于线程来说,必须是没有引用并且isAlive()为false的时候才能被gc收集
      

  8.   

    class MemoryControlUtil{
        public static final List listTemp = new ArrayList();
    }class FatherClass{
        public FatherClass(){
            MemoryControlUtil.listTemp.add(this);
        }
    }
    class Son extends FatherClass{
        @Override 
        protected void finalize() 
        { 
            System.out.println("回收"); 
        }
    }
    class MainClass{
        public static void main(String[] args){
            new Son();
            while(true){
                System.out.println(MemoryControlUtil.listTemp);
                
            }
        }
    }这样就不会回收了。说明,JFrame对象,JAVA在帮我注册到了一些控制器里,setVisiable应该是注册的操作。
      

  9.   

    java 中的对象 在生成时,就会被jvm 线程给监视,如果该对象长时间没被使用,jvm 会自动回收该资源,程序员可以用 system.gc() 建议jvm 回收该资源,但是否执行,要看jvm