第六回渋谷java java8のjvm監視を考える
TRANSCRIPT
![Page 1: 第六回渋谷Java Java8のJVM監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/1.jpg)
第六回 # 渋谷 JavaJava8 の JVM 監視を考
える2014.5.31@chonaso
![Page 2: 第六回渋谷Java Java8のJVM監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/2.jpg)
観覧枠が速攻埋まってたので LT します
![Page 3: 第六回渋谷Java Java8のJVM監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/3.jpg)
本日のテーマ
• アプリケーションサーバ JVM のメモリ監視、Java8 ならどうなるだろうか、を考えました。• チューニング関係は省略します。
![Page 4: 第六回渋谷Java Java8のJVM監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/4.jpg)
2014.3.18 祝 ?
Java 8 正式リリース
![Page 5: 第六回渋谷Java Java8のJVM監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/5.jpg)
新機能
•ラムダ• Date-Time API• タイプアノテーション• 新 JavaScript エンジン• JavaFX8• コンパクトプロファイルなど
![Page 6: 第六回渋谷Java Java8のJVM監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/6.jpg)
そろそろ Web アプリでも使う?
• 主要な JavaEE サーバの Java8 への本格対応はまだ微妙?
![Page 7: 第六回渋谷Java Java8のJVM監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/7.jpg)
終了?
∧_∧ / ̄ ̄ ̄ ̄ ̄ [( ・∀・)< JavaEE8 頃に起こして|  ̄ ̄ ̄ ̄ ̄ ̄ \_____| |  ̄ ̄ ̄ ̄ | || | @ @ | || | @ @ | || | ____ | || _______ _|
![Page 8: 第六回渋谷Java Java8のJVM監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/8.jpg)
Java8 JVM 的な進化
• メモリ消費の改善• 階層型コンパイルの標準化• JIT コンパイラの最適化
レガシーコードでもメリットあるかも?
![Page 9: 第六回渋谷Java Java8のJVM監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/9.jpg)
監視メトリクスの決定的な変更
![Page 10: 第六回渋谷Java Java8のJVM監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/10.jpg)
PermGen の廃止
• PermGen(Permanent Generation) のデメリットを解消• サイズを決めにくい• FullGC 対象によるパフォーマンスへの影響
らしい。
![Page 11: 第六回渋谷Java Java8のJVM監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/11.jpg)
MetaspacePermGen に代わる新領域• ヒープではなくネイティブ領域• サイズ制限がない ( 上限設定は可能 )• ガベージコレクタの管理外になるため GC パ
フォーマンスが向上• Full GC 後に拡張 / 縮小の閾値変更を行う• アンロードをクラスローダ単位で行う• 足りない&これ以上拡張できない状態で
OutOfMemoryError
![Page 12: 第六回渋谷Java Java8のJVM監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/12.jpg)
この領域をどう監視する?
引き続き領域サイズと使用量を監視• よくある PermGen 不足の
OutOfMemoryError は起きにくくなりそうだが、原因が解消したわけではない• メモリの使われ方が PermGen とは違う
![Page 13: 第六回渋谷Java Java8のJVM監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/13.jpg)
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監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/14.jpg)
Compressed Class Space圧縮 OOP(Ordinary Object Pointer) 用領域• Metaspace の一部• 64 ビット環境でもポインタを圧縮して 32
ビットで格納する• 64 ビット、最大ヒープサイズ 32GB 以下で使
用可能 ( デフォルト ?)• CompressedClassSpace 要因の
OutOfMemoryError が発生する。
![Page 15: 第六回渋谷Java Java8のJVM監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/15.jpg)
監視しておいたほうがよさそう
• Metaspace• デフォルトの最大サイズは無限大 (unlimited)• 初期サイズは指定できない→ サイズが常に変化する
• CompressedClassSpace• デフォルトの最大サイズは 1GB
( いきなり 1GB 分 reserve します )• 使用量はオブジェクト数・オブジェクトサイズ ( フィール
ド数 ) などに依存• 最大サイズを無限にできない→ 不足を検知しないとならない
![Page 16: 第六回渋谷Java Java8のJVM監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/16.jpg)
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監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/17.jpg)
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監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/18.jpg)
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監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/19.jpg)
オブジェクト統計情報
• クラス数を調べる 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監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/20.jpg)
ネイティブ観点の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監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/21.jpg)
OS から見た JVM• CompressedClassSpace の確保し過ぎによ
るオーバーコミット時の OOM Killer 発動に注意。
![Page 22: 第六回渋谷Java Java8のJVM監視を考える](https://reader031.vdocuments.site/reader031/viewer/2022020119/58a8fff51a28ab837c8b6929/html5/thumbnails/22.jpg)
終わり