最近看了深入jvm第2版,里面提到了火车算法。有一个地方不是很明白。在其算法中,它这样描述。如果不存在任何来自最小数字火车以外的引用指向它内部包含的对象,那么整列最小数字火车包含的都是垃圾,可以被抛弃。
    然后在下面的地方,提到,一旦没有从成熟对象空间外部来的引用,也没有从成熟对象空间内其他火车来的引用,那么这节正在被收集的车厢剩余的外部引用都是来自于同一列火车的其他车厢。算法把这样的对象转移到这节最小数字火车的最后一个车厢去。然后这些对象被扫描,查找对原被收集车厢的引用。任何新发现的被引用的对象也被转移到同一列火车的尾部......
    为何到了“一旦没有从成熟对象空间外部来的引用,也没有从成熟对象空间内其他火车来的引用,那么这节正在被收集的车厢剩余的外部引用都是来自于同一列火车的其他车厢。”这个地方的时候,按照前面的说法,就已经是整个列车是垃圾了,为何还要做那么多工作?
    更确切的说,我对“如果不存在任何来自最小数字火车以外的引用指向它内部包含的对象,那么整列最小数字火车包含的都是垃圾,可以被抛弃。”感到质疑,如果在同一列火车的不同车箱B,有一个引用是指向同一列火车的车厢A内的对象,请问整列火车应该被抛弃吗?照说,如果有一个对象还有引用指向它就不应该被抛弃,但是此时没有任何来自其他火车的引用,那整列火车是垃圾?
    请高手赐教

解决方案 »

  1.   

    为何到了“一旦没有从成熟对象空间外部来的引用,也没有从成熟对象空间内其他火车来的引用,那么这节正在被收集的车厢剩余的外部引用都是来自于同一列火车的其他车厢。”这个地方的时候,按照前面的说法,就已经是整个列车是垃圾了,为何还要做那么多工作?
                    ~~~~~~~~~~~~~~~~~~~~~~~~ 不是,被同一列车其他车厢引用。
    “如果不存在任何来自最小数字火车以外的引用指向它内部包含的对象,那么整列最小数字火车包含的都是垃圾,可以被抛弃。”
        你的理解误区是:没有全面分析。假如有火车A、B。而B的第一节车厢只有第三节车厢。那么在收集B第一节车厢的时候,发现只有列车B其他车厢引用的时候,当然不能把整个列车B给收集掉,而要在收集到B列车最后一节车厢,发现都只是列车B内的引用,才可以把整个列车B当作垃圾收集。