如题~

解决方案 »

  1.   

    java虚拟机的那档子事,只是肤浅的知道一些
    jvm通过垃圾收集算法来检测出垃圾对象,并回收它的内存空间
    垃圾检测通常是通过建立一个跟对象的集合,并检查从这些跟对象开始的可触及性来实现的。如果正在执行的程序可以访问到的根对象和某个对象之间存在引用路径,那么这个对象就是可触及的。
    区分活的对象和垃圾的基本方法是引用计数和跟踪,引用计数收集器为堆中的每一个对象保存一个计数,该计数记录每个对象的引用次数,当有新的引用的时候计数加一,当计数为0的时候当作垃圾收回,就是LZ说的不会再被引用。
    跟踪垃圾收集器追踪从根节点开始的对象引用图,当追踪结束后,未被标记的对象就是不可达的,即也不会再被引用。
      

  2.   

    楼主可能不太了解 垃圾回收 这个本人暑假刚学 Java也不太了解就把自己知道的说一说LZ 知道什么是 多个对象的孤岛情况吗
    知道的话就不会认为 “没有引用指向的对象就是垃圾,有引用指向的就不是垃圾” 这句号称是被误解很多的其实不然 有引用的一样可能是垃圾 关键看这些对象能不能被活动的线程访问到 
    例如class Island{
    public Island brother;
    }//运行下面代码片段
    Island il = new Island();
    Island i2 = new Island();
    Island i3 = new Island();

    il.brother = i2;
    i2.brother = i3;
    i3.brother = i1;

    i1 = null;
    i2 = null;
    i3 = null;

    // 这样 三个对象循环指向  但他们形成了孤岛 所以已经成为垃圾 
      

  3.   

    据我了解 垃圾收集器的工作策略有很多 好像有什么 标识与清除算法,引用算法等等 
    至于算法是怎么样子的 不知道 可以去Google一下
      

  4.   

    贴一个孤岛垃圾的例子 运行了就明白 class Island{
    public Island brother;
    String name;
    public Island(){
    }
    public Island(String name){
    this.name = name;
    }
    public void finalize(){
    System.out.println(this.name + "对象成为垃圾,被收集");
    }
    public void testIsland(){
    Island i1 = new Island("孤岛中的 O1");
    Island i2 = new Island("孤岛中的 O2");
    Island i3 = new Island("孤岛中的 O3");

    i1.brother = i2;
    i2.brother = i3;
    i3.brother = i1;

    i1 = null;
    i2 = null;
    i3 = null;
    // 这样 三个对象循环指向  但他们形成了孤岛 所以已经成为垃圾 

    System.gc();//可以看到 三个对象很快被收集,但程序过了10s才结束
    try{
    Thread.sleep(10000);
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    }public class Test{
    public static void main(String[] args){
    new Island().testIsland();
    }
    }
      

  5.   

    java的GC使用的算法有3中:
    引用计数、自适应(停止-复制、标记-清扫)
    看了tij还是不明白
      

  6.   

    在java语言中。
      GC有两种方法的运用,但是这两种方法都只是建议不是强制的执行。
      System.gc().方法和另外一种方法。
      当某一个对象的引用为0的时候,jvm就会执行。
      

  7.   

    引用计数方法不好,没有一种虚拟机使用它。Java 虚拟机启动一个线程从栈和静态储存区开始,遍历所有引用,就可以找到所有还在使用中的对象。至于没有被引用的对象,或者像 3 楼说的那种“孤岛”,不会被遍历到,所以会被回收。基于这样的理论,有两种实践方法,一种方法暂停当前程序的执行,将所有找到的对象复制到另一块内存区域,没有找到的对象自然就没有复制,这种方法叫“停止-复制”,另一种方法并不暂停程序,在遍历到对象时给它设个标记,遍历完后回收所有没有标记的对象。这种方法叫“标记-清除”。
      

  8.   

    引用计数不好的原因 3 楼已经说了,就是那种“孤岛”必须引入一个复杂的算法来判定。Java 里引用和解除引用就是通过“=”赋值实现的,例如 a = b 或者 a = new T(),编译器就可以先把原来 a 指向的对象的引用减去 1,再把 b 指向的对象或者新生成的对象的引用加上 1, 如果 a = null,那么就把 a 指向的对象的引用减 1——这样就完成了引用计数。