G1GCでのエラーメッセージ


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で検索してもソースコードくらいしか情報が得られません。
よろしくお願いいたします。

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2013/02/23 21:50:20
  • 終了:2013/02/25 15:02:22
id:takjoe

環境は
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

になります。

回答(1件)

id:oil999 No.1

oil999回答回数1728ベストアンサー獲得回数3202013/02/23 22:13:16

17Gバイトではなく、16Mバイトのヒープを要求しています。

1) いいえ。前述のように、ヒープはバイト単位でアローケートしているので、一気にそれほど大きなメモリを要求することはありません。
2) 普通のアプリであれば、問題なく動かせるはずです。
3) 可能性としては、大量のメモリを消費するスレッドが同時に動いていることが考えられます。
Runtime.getRuntime().totalMemory でメモリ量の監視を行ってみてください。
http://sattontanabe.blog86.fc2.com/blog-entry-49.html

id:takjoe

>17Gバイトではなく、16Mバイトのヒープを要求しています。
スミマセン読み間違えたみたいです。

追加の情報になってしまって申し訳ないのですが、
このメッセージは断続的に出ています。
大量のメモリを消費するスレッド等は走っていません。
VisualVMでメモリ量を監視しているのですが、
急に増えるということはなく、ゆるやかな傾きで増加していっています。
その過程でアロケートしようとして失敗している感じかなと思っています。
単純にアロケートの失敗に見えなくもないのですが、
失敗する理由がわかればと思います。

2013/02/23 22:22:36
id:takjoe

oil999 さま のご指摘通り
17Gではなく16Mの拡張要求でした。

  • id:windofjuly
    うぃんど 2013/02/24 01:33:46
    oil999への個人攻撃と取られると困るのでコメントしようかどうか迷ったのですが、
    質問者が違う方向へ誘導されるのは見ていられないのでコメントします。


    17Gではなく16Mというのは正解。
    ヒープがバイト単位というはウソ。リージョン単位。
    普通というのは逃げ。普通とは普遍的な意味ではなく状況によって意味の変わる言葉なので技術論で使う言葉ではない。
    スレッドが同時に動いているというのは意味不明。ここで最初に疑うのはメモリーリーク。
    Runtime.getRuntime().totalMemory()を使えという謎の指示。gc.logを見ればわかること。

    ここまでは長らくJAVAに触れることのなかった私でも数分で探すことが出来た情報。

    http://www.narihiro.info/g1gc-impl-book/
    http://www.narihiro.info/ebook/g1gc-impl-20120914.pdf
    http://d.hatena.ne.jp/cco/20121203

    oil999の検索速度と、情報をそれらしくまとめる力には毎度毎度驚いているが、
    これほどまでにいいかげんな回答を繰り返されると質問者も迷惑。

    質問者さんにはあまりわからないことかもしれないけれど、
    サーチエンジンの高性能化で正しい情報も一部含まれているため騙されたことに気づかないのです。

    やさしくしてはいけません。
    他の質問者も迷惑することなのでウソや間違いだらけの回答しか付かない場合はキャンセルしてください。
    正しい回答であれば利用規約に反しますが、ウソや間違いだらけの回答をキャンセルしても誰も文句は言いません。

    もっともっと解決に直結する情報があれば良いのですが、
    即答できる回答は持ち合わせておらず、
    java使いの人が通りがかってくれるのを祈りつつ、
    logを見ながらメモリーリークの元を探ってみてください。

    一週間で勝手にポイント割り振られてしまうので、
    3日待っても良回答が付かないようなら早めにキャンセルが賢い選択となります。
  • id:takjoe
    windofjuly さま
    ありがとうございます。

    キャンセルします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません