Java ヒープサイズについて
「ヒープサイズを1GBとるようにして、プログラムを実行する」という問題があって、ヒープサイズについて全然わからなかったので、その辺りについて調べたことをまとめておきます。
JavaVMのメモリ構造
Javaのプロセスでは、Javaヒープ、Permヒープ、Cヒープ、スレッドスタックという4つのメモリ領域を使用する。
Javaヒープは、アプリケーションプログラムの各種オブジェクトを格納する領域
<Javaヒープの内訳>
- New領域
- Eden
→ 生成されたばかりのオブジェクト
- Survivor(from、to)
→ ある程度の間使用されているオブジェクト
- Old領域
→ 長期間使用されたオブジェクト
Permヒープは、クラスやメソッドなどのメタデータを格納する領域
CヒープはOSネイティブなメモリ領域
スレッドスタックは、Javaのアプリケーションが利用するJavaスレッドのスタック領域
各種メモリサイズの指定方法
JavaVM起動時のオプションで指定することができる。
以下のようなオプションがある。これらのオプションを使用してメモリサイズを設定できる。
メモリの不足はjava.lang.OutOfMemoryErrorが発生することや、GCの多発を引き起こすことになる。
<オプション>
- Xmx
→ Javaヒープの最大サイズを設定。単位はバイト。
- Xms
→ Javaヒープの初期サイズを設定。単位はバイト。
- XX:MaxPermSize
→ Permヒープの最大サイズを設定。単位はバイト。
- XX:PermSize
→ Permヒープの初期サイズを設定。単位はバイト。
- Xmn
→ New領域の初期値および最大値を設定。単位はバイト。
- Xss
→ 1スタック領域の最大サイズを設定。単位はバイト。
- XX:NewRatio
→ New領域に対するOld領域の割合を設定。2を設定した場合は、New領域とOld領域の割合が、1:2になる。
GCの仕組み
前提として、Javaではアプリケーションプログラムで使用済みのメモリを明示的に削除する必要はない。それは、不要になったメモリはJavaVMによって自動的に回収されるためです。
プログラムの処理が進むとJavaVMのメモリ空間の使用できるメモリ領域が減ります。
そして、メモリ領域が足りなくなった際に、JavaVMは使用済みの不要になったメモリ領域を回収します。この仕組みがGCです。
冒頭の問題の答え
java -Xms1024m -Xmx1024m ○○
で、実行する。
参考URL:
http://namihira.hatenablog.com/entry/20151223/1450833525
http://www.atmarkit.co.jp/ait/articles/0504/02/news005.html