第六回渋谷Java Java8のJVM監視を考える

22
第第第 # 第第 Java Java8 第 JVM 第第第第第第 2014.5.31 @chonaso

Transcript of 第六回渋谷Java Java8のJVM監視を考える

Page 1: 第六回渋谷Java Java8のJVM監視を考える

第六回 # 渋谷 JavaJava8 の JVM 監視を考

える2014.5.31@chonaso

Page 2: 第六回渋谷Java Java8のJVM監視を考える

観覧枠が速攻埋まってたので LT します

Page 3: 第六回渋谷Java Java8のJVM監視を考える

本日のテーマ

• アプリケーションサーバ JVM のメモリ監視、Java8 ならどうなるだろうか、を考えました。• チューニング関係は省略します。

Page 4: 第六回渋谷Java Java8のJVM監視を考える

2014.3.18 祝 ?

Java 8 正式リリース

Page 5: 第六回渋谷Java Java8のJVM監視を考える

新機能

•ラムダ• Date-Time API• タイプアノテーション• 新 JavaScript エンジン• JavaFX8• コンパクトプロファイルなど

Page 6: 第六回渋谷Java Java8のJVM監視を考える

そろそろ Web アプリでも使う?

• 主要な JavaEE サーバの Java8 への本格対応はまだ微妙?

Page 7: 第六回渋谷Java Java8のJVM監視を考える

終了?

    ∧_∧  / ̄ ̄ ̄ ̄ ̄  [( ・∀・)<   JavaEE8 頃に起こして|  ̄ ̄ ̄ ̄ ̄ ̄ \_____|    |  ̄ ̄ ̄ ̄ |    ||    |   @  @ |    ||    | @  @  |    ||    | ____ |    || _______ _|

Page 8: 第六回渋谷Java Java8のJVM監視を考える

Java8 JVM 的な進化

• メモリ消費の改善• 階層型コンパイルの標準化• JIT コンパイラの最適化

レガシーコードでもメリットあるかも?

Page 9: 第六回渋谷Java Java8のJVM監視を考える

監視メトリクスの決定的な変更

Page 10: 第六回渋谷Java Java8のJVM監視を考える

PermGen の廃止

• PermGen(Permanent Generation) のデメリットを解消• サイズを決めにくい• FullGC 対象によるパフォーマンスへの影響

らしい。

Page 11: 第六回渋谷Java Java8のJVM監視を考える

MetaspacePermGen に代わる新領域• ヒープではなくネイティブ領域• サイズ制限がない ( 上限設定は可能 )• ガベージコレクタの管理外になるため GC パ

フォーマンスが向上• Full GC 後に拡張 / 縮小の閾値変更を行う• アンロードをクラスローダ単位で行う• 足りない&これ以上拡張できない状態で

OutOfMemoryError

Page 12: 第六回渋谷Java Java8のJVM監視を考える

この領域をどう監視する?

引き続き領域サイズと使用量を監視• よくある PermGen 不足の

OutOfMemoryError は起きにくくなりそうだが、原因が解消したわけではない• メモリの使われ方が PermGen とは違う

Page 13: 第六回渋谷Java Java8のJVM監視を考える

jstat• PC/PU が MC/MU,CCSC/CCSU に変更されて

いる

Java7$ /usr/java/jdk8/bin/jstat -gc 6516 S0C S1C S0U S1U EC EU OC OU PC PU (略 )2560.0 2560.0 0.0 0.0 30720.0 317.5 36864.0 15032.1 28672.0 14250.7 (略 )

Java8$ /usr/java/jdk8/bin/jstat -gc 15802 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU (略 )4096.0 4096.0 0.0 0.0 32768.0 368.8 14336.0 11029.2 15104.0 14456.5 1792.0 1597.2

Page 14: 第六回渋谷Java Java8のJVM監視を考える

Compressed Class Space圧縮 OOP(Ordinary Object Pointer) 用領域• Metaspace の一部• 64 ビット環境でもポインタを圧縮して 32

ビットで格納する• 64 ビット、最大ヒープサイズ 32GB 以下で使

用可能 ( デフォルト ?)• CompressedClassSpace 要因の

OutOfMemoryError が発生する。

Page 15: 第六回渋谷Java Java8のJVM監視を考える

監視しておいたほうがよさそう

• Metaspace• デフォルトの最大サイズは無限大 (unlimited)• 初期サイズは指定できない→ サイズが常に変化する

• CompressedClassSpace• デフォルトの最大サイズは 1GB

( いきなり 1GB 分 reserve します )• 使用量はオブジェクト数・オブジェクトサイズ ( フィール

ド数 ) などに依存• 最大サイズを無限にできない→ 不足を検知しないとならない

Page 16: 第六回渋谷Java Java8のJVM監視を考える

jcmd• PerfCounter.print で確認$ /usr/java/jdk8/bin/jcmd 20314 PerfCounter.print |\ egrep "sun.gc.metaspace|sun.gc.compressedclassspace"sun.gc.compressedclassspace.capacity=1835008sun.gc.compressedclassspace.maxCapacity=1073741824sun.gc.compressedclassspace.minCapacity=0sun.gc.compressedclassspace.used=1635480sun.gc.metaspace.capacity=15466496sun.gc.metaspace.maxCapacity=1088421888sun.gc.metaspace.minCapacity=0sun.gc.metaspace.used=14783248

Page 17: 第六回渋谷Java Java8のJVM監視を考える

jmap• Metaspace が取れない・・・$ /usr/java/jdk8/bin/jmap -heap 20314~略~Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70~略~ MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 0 (0.0MB)

Heap Usage:PS Young GenerationEden Space: capacity = 31457280 (30.0MB)~略~PS Old Generation capacity = 61341696 (58.5MB) used = 10789152 (10.289337158203125MB) free = 50552544 (48.210662841796875MB) 17.58861052684295% used

9376 interned Strings occupying 817192 bytes.

Permanentがあったところは空欄

Page 18: 第六回渋谷Java Java8のJVM監視を考える

GC ログ

• 実行後の値をチェック( 最大サイズとの比較 )

131.758: [Full GC (Heap Inspection Initiated GC) 131.758: [CMS: 51721K->30733K(122880K), 0.1359317 secs] 86379K->30733K(307200K), [Metaspace: 31792K->31792K(1077248K)], 0.1360976 secs] [Times: user=0.14 sys=0.00, real=0.14 secs]

Page 19: 第六回渋谷Java Java8のJVM監視を考える

オブジェクト統計情報

• クラス数を調べる num #instances #bytes class name---------------------------------------------- 1: 87409 11724328 [C 2: 6177 6240016 [B 3: 85545 2053080 java.lang.String 4: 12649 1113112 java.lang.reflect.Method 5: 34677 1109664 java.util.HashMap$Node 6: 26085 1043400 java.util.LinkedHashMap$Entry 7: 3509 699256 [Ljava.util.HashMap$Node; 8: 6415 671104 java.lang.Class 9: 8933 551960 [Ljava.lang.Object; 10: 20576 493824 org.apache.tomcat.util.bcel.classfile.ConstantUtf8 11: 4868 350496 java.lang.reflect.Field 12: 4146 265344 java.net.URL 13: 4501 216048 org.apache.catalina.loader.ResourceEntry 14: 9434 201936 [Ljava.lang.Class; 15: 6079 194528 java.util.concurrent.ConcurrentHashMap$Node 16: 3956 189888 java.util.HashMap 17: 7096 170304 java.util.ArrayList 18: 1987 158960 java.lang.reflect.Constructor

Page 20: 第六回渋谷Java Java8のJVM監視を考える

ネイティブ観点のMetaspace• ざっくり数えるならこちらが楽

$ /usr/java/jdk8/bin/jcmd 20314 VM.native_memory20314:

Native Memory Tracking:

Total: reserved=2364320KB, committed=189932KB

- Java Heap (reserved=978944KB, committed=98816KB) (mmap: reserved=978944KB, committed=98816KB)

- Class (reserved=1066401KB, committed=18593KB) (classes #2344) (malloc=3489KB, #2695) (mmap: reserved=1062912KB, committed=15104KB)

- Thread (reserved=18580KB, committed=18580KB) (thread #18) (stack: reserved=18504KB, committed=18504KB) (malloc=55KB, #94) (arena=21KB, #36)~省略~

Page 21: 第六回渋谷Java Java8のJVM監視を考える

OS から見た JVM• CompressedClassSpace の確保し過ぎによ

るオーバーコミット時の OOM Killer 発動に注意。

Page 22: 第六回渋谷Java Java8のJVM監視を考える

終わり