Java 8 のヒープモニタリング

3e77f9dbec6a87756d1dbdddab283aee?s=47 Nulab Inc.
October 23, 2014

Java 8 のヒープモニタリング

Presentation Slides at Java 8 HotSpot meeting http://kanjava.connpass.com/event/8860/

3e77f9dbec6a87756d1dbdddab283aee?s=128

Nulab Inc.

October 23, 2014
Tweet

Transcript

  1. 1.

    Java  8  HotSpot  Meeting #kanjava 2014/10/23  (⽊木)  @楽天株式会社  ⼤大阪⽀支社 Java

     8  のヒープモニタリング https://www.flickr.com/photos/wfryer/5165070448/
  2. 4.
  3. 12.

    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 •  お馴染みのオプションが無視されます
  4. 14.

    PermGen  is  何 •  格納する情報 •  クラスやメソッドのメタ情報 •  static  変数

    •  interned  strings  (JDK7  からはヒープ) •  JVM  が管理理するメモリ領領域 •  Full  GC  で解放
  5. 15.

    PermGen  あるある java.lang.OutOfMemoryError: PermGen space •  開発時によく⾒見見る •  DI  コンテナなどがガンガンクラス作る

    •  コンテキスト再起動時にメモリが漏漏れる •  運⽤用時は様⼦子⾒見見しながらサイズ調整 •  クラスローダ怪しいとき  JVM  ごと再起動
  6. 16.

    Metaspace  is  何 •  格納する情報 •  クラスやメソッドのメタ情報 •  ネイティブメモリ • 

    クラスローダー毎にもつ •  なので基本バラバラの⾮非連続領領域 •  Full  GC  時に領領域調整
  7. 17.

    Compressed  Class  Space  is  何 •  格納する情報 •  クラス情報に特化 • 

    Compressed  Oops  (圧縮  OOP)  を利利⽤用 •  64bit  環境で有効 •  ポインタを  32bit  で表現  (32GB  まで) •  統計情報的には  Metaspace  に含まれる
  8. 19.

    Metaspace  と  GC •  GC  時の  Metaspace  の振る舞い •  クラスがアンロードされると、利利⽤用し

    ていたチャンクは再利利⽤用されるか、解 放される •  クラスローダが破棄されると、関連す る  Metaspace  が解放される
  9. 20.

    Metaspace  と  GC(続) •  Metaspace  の領領域が閾値に達すると   FullGC  を実⾏行行する • 

    クラスのアンロードや、クラスローダ の破棄により領領域を確保しようとする •  Full  GC  そのもので  Metaspace  の領領域を 解放する訳ではない
  10. 21.

    Metaspace  の伸縮 •  FullGC  後に解放された領領域が •  -‐‑‒XX:MinMetaspaceFreeRatio(%)  に満たな い場合は閾値を上げる • 

    -‐‑‒XX:MaxMetaspaceFreeRatio(%)  を超える 場合は閾値を下げる •  ただし  -‐‑‒XX:MinMetaspaceExpansion   (default:  256k)  に満たない場合は変更更しない
  11. 22.

    Metaspace  の伸縮(続) •  -‐‑‒XX:MinMetaspaceFreeRatio  (default: 40)  をあげると積極的に  Metaspace  を 確保しようとする

    •  -‐‑‒XX:MaxMetaspaceFreeRatio  (default: 70)  をあげると現状の  Metaspace  をな るべくキープしようとする
  12. 23.

    Compressed  Class  Space  サイズ •  起動後のサイズ調整は⾏行行われない •  -‐‑‒XX:CompressedClassSpace   (default:1G)

     で指定 •  起動時に  reserve  して、必要になるた びに  commit  される •  MaxMetaspaceSize  とは別で管理理 •  ulimit  されてる場合は注意
  13. 24.

    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  が追加  (後述)
  14. 25.

    Metaspace  まとめ •  開発時の  PermGen  問題にはさよなら •  運⽤用時は •  メモリリークを防ぐ仕組みではないの

    で、ちゃんとモニタリング •  MaxMetaspaceSize  は指定するが吉   (CompressedClassSpaceSize  は必要 に応じて)
  15. 29.

    エージェントのタイプ 1.  WAR  Agent 2.  OSGi  Agent 3.  JVM  Agent

    4.  Mule  Agent http://www.jolokia.org/agent.html 起動オプションのみで有効・無 効を切切り替えられるので、JVM   Agent  が⼿手軽  (JDK  6  以上)  
  16. 30.

    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  ⽌止まらない
  17. 31.

    MBean  の調べ⽅方 •  実⾏行行環境でどの  MBean  が調べるのは割 と⾯面倒 •  JMX::Jmx4Perl • 

    付属の  j4psh  がパワフル •  対話式コマンドで  ls/cd/cat  などでグ リグリ利利⽤用可能な  MBean  を調べれる http://search.cpan.org/~∼roland/jmx4perl/lib/JMX/Jmx4Perl.pm
  18. 32.

    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
  19. 33.

    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
  20. 34.

    j4psh  で値をみる(続) [localhost:8778 java.lang:name=Metaspace, ...] : cat Usage { committed

    => 59154432, init => 0, max => 134217728, used => 57698384 } •  j4psh  で  MBean  の名前やモニタリングしたい   Attribute  名を調べる •  傾向監視ツールでは、その値を定期的に監視する