【问题标题】:Preventing java garbage collection by making cyclic linked lists? [duplicate]通过制作循环链表来防止java垃圾收集? [复制]
【发布时间】:2012-12-26 17:15:58
【问题描述】:

可能重复:
Garbage Collection in Java and Circular References

当内存空间不足时,Java 会运行它的垃圾收集器。它通过删除未引用的对象来实现。那么如果一个对象有一个指向它自己的指针,或者任何一个总是有一个指向它的指针的循环指向结构呢?垃圾收集器会失败还是会识别出我们为了使其失败而做出的任何此类阴险尝试?

【问题讨论】:

  • 使用上述问题搜索答案不会带您进入您刚才提到的问题,或者是吗?无论如何感谢您的链接。
  • 会发生什么是这个问题将被关闭,然后点击这个问题的搜索将有一个链接到之前的问题。 (你的问题没有被否决,所以你不会失去任何代表点......)

标签: java garbage-collection


【解决方案1】:

对象是否被收集取决于垃圾收集算法

  • 引用计数 GC,不会收集循环引用
  • 但是,现代 GC 算法通常通过从根集开始遍历堆来确定对象的收集资格。

垃圾收集器将收集无法从根集访问引用(当前局部变量、静态引用、堆栈帧的操作数堆栈)的对象。这意味着即使是被其他一些对象引用的对象仍然可以被收集。

因此,您的循环指针结构将被收集,即使每个对象都被引用,但前提是没有其他引用路径从根集传递到形成循环的对象。

另见What triggers the Java Garbage Collector

【讨论】:

    【解决方案2】:

    “A 引用对象 B,B 引用 A”称为隔离岛。 GC 足够聪明,可以检测到这样的事情。如果一个岛中没有任何对象的引用,则整个岛都有资格进行垃圾收集

    【讨论】:

      【解决方案3】:

      Java 垃圾收集器不会回收静态或局部变量指向的对象的任何内存,或者从这些对象链接(递归)的任何对象。因此,如果您有大型的对象链接树,如果有一个变量指向树或循环的任何根,垃圾收集器将不会回收该空间。

      只要没有静态或局部变量指向循环中的对象,循环中链接的对象的内存就会被回收。因此,如果您希望垃圾收集有效地工作,请确保在不再需要对象时将变量清空。

      垃圾收集器确实会检测并且不关心对象是否以循环方式链接。唯一重要的是是否可以从变量中访问对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-13
        • 1970-01-01
        • 2013-09-29
        相关资源
        最近更新 更多