次のようにコードを書き直してみてください。OOME の問題は発生しないはずです...
Random r = new Random(1234697890);
HashMap<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();
for(int i=0;i<100000;i++){
List<Integer> list = new ArrayList<Integer>();
for(int j=0;j<1000;j++){
list.add(r.nextInt(100000));
}
map.put(i, list);
map.remove(i);
}
元のコードの問題は次のとおりです。
- リストを 1 つだけ作成し、
- そこにどんどん要素を追加し続け、
- そのリストは、コードが完了したときにのみガベージになります...常に「スコープ内」にあるためです。
list
宣言をループ内に移動するArrayList
と、各ループ反復で新しいが作成されて埋められ、次の反復を開始するとガベージになります。
誰かが に電話することを提案しSystem.gc()
ました。収集されるガベージは最小限であるため、あなたの場合はまったく役に立ちません。一般に、次の理由から、これは悪い考えです。
- GC は、OOME がスローされる直前に実行されることが保証されます。
- JVM は、GC を実行するのに最適な (つまり、最も効率的な) 時期をユーザーよりも正確に把握できます。
- への呼び出し
System.gc()
はとにかく完全に無視される可能性があります。System.gc()
への呼び出しが無視されるように JVM を構成できます。
1 - 私の衒学者は、ガベージになる可能性が最も高いオブジェクトをmap.put(i, list); map.remove(i);
生成している可能性が最も高いことを指摘したいと思います。ただし、無限に成長するオブジェクトInteger
と比較すると、これは「鶏の餌」です。ArrayList