第六回渋谷java java8のjvm監視を考える

Post on 19-Feb-2017

9.451 Views

Category:

Software

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

える2014.5.31@chonaso

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

本日のテーマ

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

2014.3.18 祝 ?

Java 8 正式リリース

新機能

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

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

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

終了?

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

Java8 JVM 的な進化

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

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

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

PermGen の廃止

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

らしい。

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

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

OutOfMemoryError

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

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

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

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

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

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

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

OutOfMemoryError が発生する。

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

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

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

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

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

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

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があったところは空欄

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]

オブジェクト統計情報

• クラス数を調べる 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

ネイティブ観点の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)~省略~

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

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

終わり

top related