More Related Content
Similar to 第六回渋谷Java Java8のJVM監視を考える (20)
第六回渋谷Java Java8のJVM監視を考える
- 13. 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
- 14. Compressed Class Space
圧縮OOP(Ordinary Object Pointer)用領域
• Metaspaceの一部
• 64ビット環境でもポインタを圧縮して32ビッ
トで格納する
• 64ビット、最大ヒープサイズ32GB以下で使用
可能(デフォルト?)
• CompressedClassSpace要因のOutOfMemoryError
が発生する。
- 16. jcmd
• PerfCounter.printで確認
$ /usr/java/jdk8/bin/jcmd 20314 PerfCounter.print |
egrep "sun.gc.metaspace|sun.gc.compressedclassspace"
sun.gc.compressedclassspace.capacity=1835008
sun.gc.compressedclassspace.maxCapacity=1073741824
sun.gc.compressedclassspace.minCapacity=0
sun.gc.compressedclassspace.used=1635480
sun.gc.metaspace.capacity=15466496
sun.gc.metaspace.maxCapacity=1088421888
sun.gc.metaspace.minCapacity=0
sun.gc.metaspace.used=14783248
- 17. 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 Generation
Eden 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があったところは空欄
- 18. 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]
- 19. オブジェクト統計情報
• クラス数を調べる
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
- 20. ネイティブ観点のMetaspace
• ざっくり数えるならこちらが楽
$ /usr/java/jdk8/bin/jcmd 20314 VM.native_memory
20314:
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)
~省略~
Editor's Notes
- JavaEE 7への対応すら微妙なものもありますので、Java8でJavaEEはまだ尚早かもしれません。
- あってるかわかりませんが、ヒープダンプの大きさはJava7よりJava8の方が10~20%くらい小さかったです。
clientオプションとserverオプションのいいとこ取りをしているとのこと。
アプリケーションサーバの起動が早くなるらしいですが、優位さがわかりませんでした。
- サイズ制限がない:ユーザ意識する必要性がない
ガベージコレクタの管理外になるためGCパフォーマンスが向上。
アンロードをクラスローダ単位で行うので断片化しない
- Ordinary Object Pointer=HotSpotの用語
Compressed Oops
・64bitのマシンでもオブジェクトのアドレスを32bitに格納する
(64bitはポインタがでかい)
・ヒープのベースアドレスからのオフセットを利用
・さらにアドレスのLSBを省略(#3bitシフト)
- ちなみにinternされたStringはPermanentからヒープに移動しました
- Jcmdはいろいろ見れる