Java 这会导致内存泄漏吗

Java 这会导致内存泄漏吗,java,memory,memory-leaks,garbage-collection,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() {

我不熟悉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();
    }

}
类列表节点{
int值;
listnodenext;
公共ListNode(int值){
这个值=值;
next=null;
}
}
公共类测试(){
静态void tryCreateMemoryLeak(){
列表节点l1、l2;
对于(int i=0;i<1000000;i++){
l1=新的ListNode(1);
l2=新的ListNode(2);
//在这里创建一个圆
//这个圈子会被收回吗?如果会,什么时候?
l1.next=l2;
l2.next=l1;
}
}
公共静态void main(字符串[]args){
tryCreateMemoryLeak();
}
}

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

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

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

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

由于Java JVM的GC是一个跟踪、标记和清除垃圾收集器,而不是一个引用计数器,因此不可能纯粹通过循环引用在Java中造成内存泄漏

原因是A将引用B,B将引用A,但没有其他对象将引用A或B,因此标记A和B(在标记阶段)都符合垃圾收集的条件


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

由于Java JVM的GC是一个跟踪、标记和清除垃圾收集器,而不是一个引用计数器,因此不可能纯粹通过循环引用在Java中造成内存泄漏

原因是A将引用B,B将引用A,但没有其他对象将引用A或B,因此标记A和B(在标记阶段)都符合垃圾收集的条件

JVM的GC将堆中的所有对象标记为可收集的,从其根开始的跟踪(如静态变量、类加载器等)将此跟踪可访问的所有对象标记为不可收集的,因此永远不会到达您分配的A或B实例。因此,JVM的GC将检测A和B是否符合垃圾收集的条件,并回收它们的内存。

请尝试查看

阐述得相当简洁。这可能会有帮助

试着看看

阐述得相当简洁。这可能会有所帮助

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

你不会仅仅通过创建一个复杂的引用网络来愚弄任何现代垃圾收集器。垃圾收集器已经足够成熟(并且已经有很多年了),可以可靠地处理循环引用

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

内存泄漏是指(错误地)保留一个不应该再引用的内容的实时引用

你不会仅仅通过创建一个复杂的引用网络来愚弄任何现代垃圾收集器。垃圾收集器已经足够成熟(并且已经有很多年了),可以可靠地处理循环引用


根据经验法则:今天的内存泄漏绝不是由垃圾收集器无法收集未引用的内容造成的——如果没有收集到某些内容,则总会有一个(通常隐藏得很好的)实时引用。

您应该先检查自己。请看,您应该先检查自己。请看,通过创建循环引用,圆弧中可能存在内存泄漏。这取决于GC使用的垃圾收集算法。@ DavidXu,如果它被圈子愚弄了,我就不认为它是一个现代GC。你…吗?。顺便说一句,这个问题被标记为“java”,循环依赖在java中是非常不可接受的,甚至在JDK中也是如此。因此,在java中,任何不处理循环依赖关系的GC都将被限制在一个非常小的问题域中。这取决于GC使用的垃圾收集算法。@ DavidXu,如果它被圈子愚弄了,我就不认为它是一个现代GC。你…吗?。顺便说一句,这个问题被标记为“java”,循环依赖在java中是非常不可接受的,甚至在JDK中也是如此。因此,在java中,任何不处理循环依赖关系的GC都将局限于一个非常小的问题域。