sugarlife's blog

Javaとか、http://twitter.com/sugarlife

G1 GC おさらいと #jjug_ccc で発表した話

この記事は Java Advent Calendar 2015 の一日目の記事です。二年連続でトップバッターだ!

先日の JJUG CCC 2015 Fall で G1 GC について話してきました。
去年の CMS GC と同じく結構遅めの時間帯&裏番組に伝説の灰色ページ管理人・ひしだま伝道師が発表するなどの豪華な時間帯にも関わらず、165人規模の部屋がいっぱいに埋まるぐらいの盛況でした。聴講頂いた皆様ありがとうございました!
スライドは以下に公開しました。G1 GC の挙動から GC ログの読み方、どういうケースが厄介なのかを紹介しているので是非ご覧ください!

アフターフォロー、またはちょっとした補足

極力、後から参照可能なように資料を作っていますが、どうしても口頭で補っている部分はあります。
セッションのハッシュタグである #ccc_cd6 で Twitter 検索した結果 なども合わせてご確認ください。

一般的な注意事項について
  • JDK9 から G1GC がデフォルト化されます。JDK9 を導入される際は使用する GC を明示的に指定することをお勧めします。
  • ヒープサイズが小さい環境で G1 GC を選択する際は注意してください。元々ヒープサイズが巨大な環境のために開発されたものなので、ヒープの使用「率」(-XX:InitiatingHeapOccupancyPercent) が比較的低い段階から活発に GC が実行されるなど、本来のメリットがデメリットとして襲い掛かってくることがあります
オプションについて
  • CMS GC と同様に -Xmx と -Xms は同じ値にしたほうが、拡張/シュリンク時のコストが発生しないのでお勧めです。
  • オプションで Young 領域(Eden、Survivor 空間)のサイズは指定しないほうが性能が良いケースがあります。これは Young 領域のサイズを設定しない場合は状況に応じて JVM が動的に変更するため、人間が決め打ちでやるより効率が良くなるパターンが往々にしてあるからです。
  • -XX:MaxGCPauseMillis は STW の時間を指定するものではありません(主にマーキングサイクルのコンカレント部分に効く)
検索して引っかかる古い情報について
  • 以下のスライドの Mixed GC の処理条件が最近のアップデート(JDK-8059452, JDK8 update 40)で、緩めなOld 領域をより徹底的に回収する条件に変更されてます。JDK9 でデフォルト化の話がこの辺りで出てきたので、それに前もって導入された印象です。
    • G1MixedGCLiveThreshold が 65 から 85 に変更
    • G1HeapWastePercent が 10 から 5 に変更
    • 追記 2015/12/1 12:40 @den2sn さんよりコメント頂き表現を修正。合わせてスライドも表現が誤っていたので修正。

  • 以下のスライドの Evacuation Failure が発生した際、次のページに書かれてるようにログに (to-space exhausted) という文字列が出力されます。しかし、 Oracle のドキュメント等によると (to-space overflow) と出力されるバージョンもあるようです。今回の発表スライド作成時に確認したソースコードにはそういう文字列はありませんでした。古いバージョンを利用する場合はこの文字列も注意してください。

伝えたかったこと

これまで 渋谷Java で OutOfMemoryError の話をきっかけに、JJUG CCC 2014 Fall で CMS GCJava 女子部で JVM のいろは、そして今回の G1 GC の話をしてきました。これらの発表の原動力は去年の夏の JJUG ナイトセミナー LT 大会でした「楽して JVM を学びたい」という発表が大元です。

勉強するためには、体系だった知識が下敷きにあるとないとで理解の差が段違いです。特に自分は難聴者なので、分かりやすい資料や書籍があるかが大きな差となりました。なるべく JVM の勉強をしてみたいという人に向けて、特に問題になりがちなメモリ管理の分野に関して、実際のトラブルで役に立つ知識を中心に、後から読み返してもスッと入ってこれる体系だった丁寧な資料作りを心がけてきました。

これまで OpenJDK のソースコードを読み、数々のそれなりにタフなトラブルシュートを駆け抜け、たまに OpenJDK パッチを書いて投稿しという活動を繰り返してきました。いまだにコミッターどころか Author にもなれてませんが、自分なりに Java のコミュニティに貢献できればと思い発表してきました。どこかの誰かの「楽して JVM を学びたい」という気持ちに答えられていたら幸いです

www.slideshare.net

www.slideshare.net
www.slideshare.net
www.slideshare.net
www.slideshare.net

おまけ

最終回っぽい〆をしてますが、別に Java はやめません :p