我正在玩一个可怕的数据结构,它基本上是一棵树,每个节点都将对其子节点的引用存储在一个HashMap
对象中。每当我需要摆脱根及其除一个之外的所有子树时,我都会遇到释放内存的麻烦,方法是将后一个子树设置为新根。我认为这可能是我的数据结构中的一些错误,也许是我忘记在那里的一些参考,所以没有任何东西符合垃圾收集的条件。但我想先尝试一些更简单的东西,并实现了以下测试:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class MyNode {
MyNode next;
int somedata;
public MyNode(MyNode n) {
next = n;
somedata = 0;
}
public static void main(String[] args) throws IOException {
MyNode p = new MyNode(null);
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
for (int i=0; i<10000000; i++) {
MyNode n = new MyNode(p);
p = n;
}
while (p!=null) {
MyNode p1 = p.next;
p.next = null;
p = p1;
}
in.readLine();
}
}
当 main 到达in.readline()
时,我可以在 htop 中看到该进程仍然为自己分配了 250MB 左右,并且没有任何东西被释放。我显然首先尝试简单地做
p = null;
而不是while循环。但它没有用,所以我想出了以前的代码。