main()创建Thread对象时,它并未捕获任何一个对象的句柄。普通对象对于垃圾收集来说是一种“公平竞赛”,但线程却并非如此。每个线程都会“注册”自己,所以某处实际存在着对它的一个引用。这样一来,垃圾收集器便只好对它“瞠目以对”了

解决方案 »

  1.   

    main( )创建了Thread,但是却没去拿它的reference。如果是普通对象,这一点就足以让它成为垃圾,但Thread不会。Thread都会为它自己"注册",所以实际上reference还保留在某个地方。除非run( )退出,线程中止,否则垃圾回收器不能动它
      

  2.   

    thinking in java 里有一段专门讲垃圾回收的,说到java自动垃圾回收时首先遍历栈和静态存储区中的reference,根据这些reference找出“活着”的对象,剩下的即所谓的“垃圾”但是Thread的对象是个例外,尽管没有reference指向它,依旧不会被垃圾回收器自动回收,除非线程中止
      

  3.   

    new Frame();
    这句话也会创建一个表面上没有任何引用指向它的对象。
    可是在程序运行的始终。包括显式的调用了System.gc();也不能把它给 关闭 和 释放 掉。演示代码:
    public class Main {    public static void main(String[] args) {
            new Frame1();
            System.gc();
            
        }
    }
    class Frame1 extends Frame {
        super("aaaaa");
        //Your Code......
        setSize(500,200);
        setVisible(true);
    }
      

  4.   

    我并不认为 没有人为的给一个new出来的对象加引用并不意味着系统没有给他做一个reference。