基本的にツリーである恐ろしいデータ構造で遊んでおり、各ノードはその子への参照を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 ループの代わりに。しかし、うまくいかなかったので、前のコードを思いつきました。