这会导致内存泄漏吗?

时间:2014-05-02 18:16:04

标签: java memory memory-leaks garbage-collection

我是Java垃圾收集的新手,想知道以下代码是否会导致Java中的内存泄漏。为什么或者为什么不?感谢。

class ListNode {
    int value;
    ListNode next;

    public ListNode(int value) {
        this.value = value;
        next = null;
    }
}

public class Test() {

    static void tryCreateMemoryLeak() {
        ListNode l1, l2;
        for (int i = 0; i < 1000000; i++) {
            l1 = new ListNode(1);
            l2 = new ListNode(2);

            // create a circle here
            // will this circle be reclaimed? if do, when?
            l1.next = l2;
            l2.next = l1;
        }
    }

    public static void main(String[] args) {
        tryCreateMemoryLeak();
    }

}

5 个答案:

答案 0 :(得分:2)

由于Java JVM的GC是跟踪和标记和清除垃圾收集器,而不是引用计数器,因此仅通过循环引用就不可能在Java中导致内存泄漏。

原因是A将引用B,B将引用A,但没有其他对象将引用A或B,因此标记A和B(在标记阶段期间)有资格进行垃圾收集。

JVM的GC将堆中的所有对象标记为可收集,来自其根的跟踪(例如静态变量,类加载器等)将此跟踪可到达的所有对象标记为不可收集,因此永远不会到达您分配的A或B实例。因此,JVM的GC将检测A和B是否有资格进行垃圾收集并回收它们的内存。

答案 1 :(得分:2)

答案 2 :(得分:2)

内存泄漏保留实时引用(错误地)不应再引用的内容。

通过创建复杂的引用网络,您不会愚弄任何现代垃圾收集器。垃圾收集器(已经存在很多年)已经足够成熟,可以可靠地处理循环引用。

根据经验:今天的内存泄漏是由于垃圾收集器无法收集未引用的内容而导致从不 - 如果某些内容不存在,则总会有一个(经常隐藏得很好的)实时引用。收集了。

答案 3 :(得分:0)

GC识别偶数圈。一旦您不再引用此圈(例如通过离开范围),GC将最终释放内存。在Java中创建内存泄漏是很困难的。但并非不可能(取决于内存泄漏的实际定义)。

答案 4 :(得分:0)

循环引用不会导致内存泄漏。当没有对循环引用链中的任何对象的实时引用时,对象将受到垃圾收集。实际的垃圾收集发生时取决于实现。