java - 这会导致内存泄漏吗

标签 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();
    }

}

最佳答案

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

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

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

关于java - 这会导致内存泄漏吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23434474/

相关文章:

java - 使用java api在postgres自定义类型字段中插入值

java - AndroidRuntime(5940) : java. lang.RuntimeException: 无法启动 Activity ComponentInfo

c++ - IsBadReadPtr 的最有效替代品?

c - 为什么调用 sbrk(0) 两次会给出不同的值?

c - free() 错误(使用 valgrind 调试)?

Java 服务器套接字缓冲区在 Mac 上没有被垃圾收集

java - 无法为连接 URL '' 创建类 'null' 的 JDBC 驱动程序

java - 如何使用重用 session 连接到 FTPS 服务器?

python - 使用 Requests HTTP 库了解 python 中的内存消耗增加

android - 我在 Android 中使用 ListActivity 时发生内存泄漏