• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:メモリの確保とgcについて?)

メモリの確保とgcについて

このQ&Aのポイント
  • GC(ガベージコレクション)のタイミングや判断基準に関する話題です。
  • 2つのクラスの実行結果の違い、特にメモリの確保の違いについて疑問があります。
  • WindowsXPの実行環境でエクリプスを使用しています。メモリはデフォルトの64MBです。

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

> map = new HashMap(5000000); このコードの動作を見てみましょう。 まず5000000エントリのHashMapが作られ、それからmapに代入されます。mapに以前あったオブジェクトは代入の際にゴミになり、GC対象となります。 要するに少なくとも2つのHashMap(5000000)が存在できるだけのメモリが必要です。 次に > ●テスト・クラス変数1、結果 > ◆VM 確保Total:17MB と > ●テスト・クラス変数2、結果 > ◆VM 確保Total:33MB に注目します。 HashMapのマップサイズは指定したエントリ数そのままではなく倍に増えています。2冪に切り上げしているのかもしれません。 これらから、後半のテストで2回目のHashMap作成には少なくとも66MB以上のメモリを必要とするだろうことが分かります。 メモリは64MBしかありませんからOutOfMemoryErrorになります。

arakororin
質問者

お礼

あ、そうか。そうですね。 次のインスタンスがnewされて前のオブジェクトの参照が…とかの問題ですね。 参考になりました。ありがとうございました。 ちなみにVM確保だけではメモリの実使用状況はわからないので、下記のメソッドで確認したところ、 4194304までが16.0MB、4194305以上が32.0MBでした。 private static void メモリ表示する() { System.gc(); double VM確保 = Runtime.getRuntime().totalMemory() / 1024 / 1024; double VM実使用 = VM確保 - Runtime.getRuntime().freeMemory() / 1024 / 1024; System.out.println("◆VM確保:" + VM確保 + "MB ◆VM実使用:" + VM実使用 + "MB"); }