WebアプリをG1GCを使ってみましました。
しばらく動かしていると、gc.log に以下のようなメッセージが出力されます。
10632.453: [G1Ergonomics (Heap Sizing) attempt heap expansion, reason: humongous allocation request failed, allocation request: 16793616 bytes]
10632.453: [G1Ergonomics (Heap Sizing) expand the heap, requested expansion amount: 17825792 bytes, attempted expansion amount: 17825792 bytes]
10632.453: [G1Ergonomics (Heap Sizing) did not expand the heap, reason: heap expansion operation failed]
17Gものメモリを要求しているようです。
サーバに搭載してあるメモリは16Gで増設しても到底足りそうにありません。
そこで、
1)G1GCは大量にメモリが必要なのでしょうか?
2)8G程度のメモリで動かすことができるのでしょうか?
3)このメッセージが出た場合の問題点はどこでしょうか?
についてご教示いただければと思います。
非常に情報が少なく、エラー文をGoogleで検索してもソースコードくらいしか情報が得られません。
よろしくお願いいたします。
環境は
CentOS release 6.2 (Final) 64bit
jdk 1.7.0_13
Tomcat 7.0.35
起動オプションは
-server -Djava.awt.headless=true -Xms3g -Xmx3g -XX:+UseG1GC -XX:MaxGCPauseMillis=200
ロギングオプションは
-Xloggc:$CATALINA_HOME/logs/gc.log -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintAdaptiveSizePolicy -XX:+PrintFlagsFinal
になります。
17Gバイトではなく、16Mバイトのヒープを要求しています。
1) いいえ。前述のように、ヒープはバイト単位でアローケートしているので、一気にそれほど大きなメモリを要求することはありません。
2) 普通のアプリであれば、問題なく動かせるはずです。
3) 可能性としては、大量のメモリを消費するスレッドが同時に動いていることが考えられます。
Runtime.getRuntime().totalMemory でメモリ量の監視を行ってみてください。
http://sattontanabe.blog86.fc2.com/blog-entry-49.html
>17Gバイトではなく、16Mバイトのヒープを要求しています。
2013/02/23 22:22:36スミマセン読み間違えたみたいです。
追加の情報になってしまって申し訳ないのですが、
このメッセージは断続的に出ています。
大量のメモリを消費するスレッド等は走っていません。
VisualVMでメモリ量を監視しているのですが、
急に増えるということはなく、ゆるやかな傾きで増加していっています。
その過程でアロケートしようとして失敗している感じかなと思っています。
単純にアロケートの失敗に見えなくもないのですが、
失敗する理由がわかればと思います。