我是 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/