Slide 1

Slide 1 text

Java  8  HotSpot  Meeting #kanjava 2014/10/23  (⽊木)  @楽天株式会社  ⼤大阪⽀支社 Java  8  のヒープモニタリング https://www.flickr.com/photos/wfryer/5165070448/

Slide 2

Slide 2 text

染⽥田  貴志 SOMEDA  Takashi @tksmd 株式会社ヌーラボ エバンジェリスト

Slide 3

Slide 3 text

https://cacoo.com/diagrams/zIPOGa9u3sP8NHHf http://d.hatena.ne.jp/tksmd/20100929 http://d.hatena.ne.jp/tksmd/20110720 2年年ぶり5度度⽬目の登板 http://www.slideshare.net/tksmd/messagepack-‐‑‒rpc-‐‑‒20128

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

巻き込み型オフィス改修

Slide 6

Slide 6 text

その結果

Slide 7

Slide 7 text

#IT業界のTOKIO !!!

Slide 8

Slide 8 text

インフラ(事務所つくり) 担当募集中 https://nulab-‐‑‒inc.com/ja/career/

Slide 9

Slide 9 text

本⽇日のお話 1.  Metaspace  と  Compressed  Class  Space 2.  jolokia  によるモニタリング 3.  まとめ  

Slide 10

Slide 10 text

お話の前提 •  現在最新の  JDK  1.8.0u25  に基づきます •  ウェブアプリの運⽤用をベースにしてます

Slide 11

Slide 11 text

1.  Metaspace  と  Compressed  Class  Space

Slide 12

Slide 12 text

PermGen  がなくなりました $ java -version java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode) $ java -XX:PermSize=128m -XX:MaxPermSize=256m Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0 Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0 •  お馴染みのオプションが無視されます

Slide 13

Slide 13 text

JEP  122:  Remove  the  Permanent  Generation   http://openjdk.java.net/jeps/122 動機として  JRockit  との統合も あげられています

Slide 14

Slide 14 text

PermGen  is  何 •  格納する情報 •  クラスやメソッドのメタ情報 •  static  変数 •  interned  strings  (JDK7  からはヒープ) •  JVM  が管理理するメモリ領領域 •  Full  GC  で解放

Slide 15

Slide 15 text

PermGen  あるある java.lang.OutOfMemoryError: PermGen space •  開発時によく⾒見見る •  DI  コンテナなどがガンガンクラス作る •  コンテキスト再起動時にメモリが漏漏れる •  運⽤用時は様⼦子⾒見見しながらサイズ調整 •  クラスローダ怪しいとき  JVM  ごと再起動

Slide 16

Slide 16 text

Metaspace  is  何 •  格納する情報 •  クラスやメソッドのメタ情報 •  ネイティブメモリ •  クラスローダー毎にもつ •  なので基本バラバラの⾮非連続領領域 •  Full  GC  時に領領域調整

Slide 17

Slide 17 text

Compressed  Class  Space  is  何 •  格納する情報 •  クラス情報に特化 •  Compressed  Oops  (圧縮  OOP)  を利利⽤用 •  64bit  環境で有効 •  ポインタを  32bit  で表現  (32GB  まで) •  統計情報的には  Metaspace  に含まれる

Slide 18

Slide 18 text

詳しくはこちらで・・・ http://www.slideshare.net/YaSuenag/metaspace

Slide 19

Slide 19 text

Metaspace  と  GC •  GC  時の  Metaspace  の振る舞い •  クラスがアンロードされると、利利⽤用し ていたチャンクは再利利⽤用されるか、解 放される •  クラスローダが破棄されると、関連す る  Metaspace  が解放される

Slide 20

Slide 20 text

Metaspace  と  GC(続) •  Metaspace  の領領域が閾値に達すると   FullGC  を実⾏行行する •  クラスのアンロードや、クラスローダ の破棄により領領域を確保しようとする •  Full  GC  そのもので  Metaspace  の領領域を 解放する訳ではない

Slide 21

Slide 21 text

Metaspace  の伸縮 •  FullGC  後に解放された領領域が •  -‐‑‒XX:MinMetaspaceFreeRatio(%)  に満たな い場合は閾値を上げる •  -‐‑‒XX:MaxMetaspaceFreeRatio(%)  を超える 場合は閾値を下げる •  ただし  -‐‑‒XX:MinMetaspaceExpansion   (default:  256k)  に満たない場合は変更更しない

Slide 22

Slide 22 text

Metaspace  の伸縮(続) •  -‐‑‒XX:MinMetaspaceFreeRatio  (default: 40)  をあげると積極的に  Metaspace  を 確保しようとする •  -‐‑‒XX:MaxMetaspaceFreeRatio  (default: 70)  をあげると現状の  Metaspace  をな るべくキープしようとする

Slide 23

Slide 23 text

Compressed  Class  Space  サイズ •  起動後のサイズ調整は⾏行行われない •  -‐‑‒XX:CompressedClassSpace   (default:1G)  で指定 •  起動時に  reserve  して、必要になるた びに  commit  される •  MaxMetaspaceSize  とは別で管理理 •  ulimit  されてる場合は注意

Slide 24

Slide 24 text

Metaspace  のモニタリング $ jstat -gc 25709 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 19648.0 19648.0 1123.9 0.0 157312.0 132866.5 458752.0 81938.3 57768.0 56338.2 6576.0 6276.8 1444 16.842 2 0.360 17.202 •  jstat  ベースのモニタリングエージェントは フィールド名が変わった事による影響を受ける ものもアリ •  JMX  には新たに  MXBean  が追加  (後述)

Slide 25

Slide 25 text

Metaspace  まとめ •  開発時の  PermGen  問題にはさよなら •  運⽤用時は •  メモリリークを防ぐ仕組みではないの で、ちゃんとモニタリング •  MaxMetaspaceSize  は指定するが吉   (CompressedClassSpaceSize  は必要 に応じて)

Slide 26

Slide 26 text

気になる⼈人はこの辺り hotspot/src/share/vm/memory/metaspace.cpp hotspot/src/share/vm/memory/metaspace.hpp http://hg.openjdk.java.net/jdk8/jdk8/hotspot

Slide 27

Slide 27 text

2.  jolokia  によるモニタリング

Slide 28

Slide 28 text

jolokia  とは http://www.jolokia.org/ •  JMX  のブリッジ •  プロトコルは  HTTP、フォーマットは  JSON

Slide 29

Slide 29 text

エージェントのタイプ 1.  WAR  Agent 2.  OSGi  Agent 3.  JVM  Agent 4.  Mule  Agent http://www.jolokia.org/agent.html 起動オプションのみで有効・無 効を切切り替えられるので、JVM   Agent  が⼿手軽  (JDK  6  以上)  

Slide 30

Slide 30 text

JVM  Agent  の動かし⽅方 -javaagent:/usr/java/jolokia/jolokia-jvm-1.2.0- agent.jar=discoveryEnabled=false $ curl -s -o - -X POST -d '{"type":"read","mbean":"java.lang:name=PS Scavenge,type=GarbageCollector","attribute":"CollectionCount"}' http://localhost:8778/jolokia/ | jq . { "value": 62143, "request": { "type": "read", "attribute": "CollectionCount", "mbean": "java.lang:name=PS Scavenge,type=GarbageCollector" }, "status": 200, "timestamp": 1411542268 } AWS  環境では、これつけないと   JVM  ⽌止まらない

Slide 31

Slide 31 text

MBean  の調べ⽅方 •  実⾏行行環境でどの  MBean  が調べるのは割 と⾯面倒 •  JMX::Jmx4Perl •  付属の  j4psh  がパワフル •  対話式コマンドで  ls/cd/cat  などでグ リグリ利利⽤用可能な  MBean  を調べれる http://search.cpan.org/~∼roland/jmx4perl/lib/JMX/Jmx4Perl.pm

Slide 32

Slide 32 text

j4psh  で値をみる $ j4psh http://localhost:8778/jolokia/ [localhost:8778] : ls java.lang java.lang: name=Code Cache,type=MemoryPool name=CodeCacheManager,type=MemoryManager name=Compressed Class Space,type=MemoryPool name=Copy,type=GarbageCollector name=Eden Space,type=MemoryPool name=MarkSweepCompact,type=GarbageCollector name=Metaspace Manager,type=MemoryManager name=Metaspace,type=MemoryPool name=Survivor Space,type=MemoryPool name=Tenured Gen,type=MemoryPool type=ClassLoading type=Compilation type=Memory type=OperatingSystem type=Runtime type=Threading

Slide 33

Slide 33 text

j4psh  で値をみる(続) [localhost:8778] : cd java.lang:name=Metaspace,type=MemoryPool [localhost:8778 java.lang:name=Metaspace, ...] : ls java.lang:name=Metaspace,type=MemoryPool Attributes: PeakUsage CompositeData PeakUsage CollectionUsageThresholdExceeded boolean Coll UsageThreshold long UsageThreshold Type String Type Usage CompositeData Usage CollectionUsage CompositeData CollectionUsage UsageThresholdSupported boolean UsageThresholdSupported CollectionUsageThresholdCount long CollectionUsageThresholdCount MemoryManagerNames String[] MemoryManagerNames CollectionUsageThreshold long CollectionUsageThreshold CollectionUsageThresholdSupported boolean Coll UsageThresholdCount long UsageThresholdCount UsageThresholdExceeded boolean UsageThresholdExceeded ObjectName ObjectName ObjectName Name String Name Valid boolean Valid Operations: void resetPeakUsage() resetPeakUsage

Slide 34

Slide 34 text

j4psh  で値をみる(続) [localhost:8778 java.lang:name=Metaspace, ...] : cat Usage { committed => 59154432, init => 0, max => 134217728, used => 57698384 } •  j4psh  で  MBean  の名前やモニタリングしたい   Attribute  名を調べる •  傾向監視ツールでは、その値を定期的に監視する

Slide 35

Slide 35 text

Mackerel  でプロット •  ⼀一定時間経つとほとんど変化はない •  現時点の  mackerel-‐‑‒agent-‐‑‒plugins  の  jvm  プラグイン は  Metaspace  未対応

Slide 36

Slide 36 text

3.  まとめ

Slide 37

Slide 37 text

本⽇日のお話 1.  Metaspace  と  Compressed  Class  Space 2.  jolokia  によるモニタリング 3.  まとめ  

Slide 38

Slide 38 text

ご清聴 ありがとうございました ツイッター、やってます。 @nulabinc