ぺーぺーSEのブログ

備忘録・メモ用サイト。

Metaspace

■Metaspace
  • 格納する情報
  • ネイティブメモリ
    • クラスローダー毎にもつ
      • なので基本バラバラの非連続領域


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


MetaspaceとGCの動き

■前提

1.MetaspaceはGCされることはない
2.FullGC後にMetaspaceの容量調整を行う
3.Metaspaceの容量調整は確保したメモリサイズを上下させるのではなく閾値の調整を行う
  FullGC後に解放された領域が
  ・「-XX:MinMetaspaceFreeRatio(%)」(default:40)に満たない場合は閾値を上げる
  ・「-XX:MaxMetaspaceFreeRatio(%)」(default:70)を超える場合は閾値を下げる
  ただし、「-XX:MinMetaspaceExpansion」(default:256k)に満たない場合は変更しない
4.GCで使用されていないクラスローダが破棄されると、そのクラスローダに紐づくMetaspaceが解放される

■動き
  1. Metaspaceからメモリを取ろうとする
    1. 今あるメモリから取ろうとする
    2. Metaspaceの要領調整(■前提の3)で取ろうとする
  2. FullGCを起こす
    1. 使用されていないクラスローダを破棄する
    2. Metaspaceの要領調整(■前提の3)で取ろうとする
  3. OutOfMemmoryError


■Metaspace関連オプション
オプション 意味 デフォルト値
-XX:MetaspaceSize Metaspaceをリサイズさせるための閾値 環境依存
-XX:MaxMetaspaceSize 最大Metaspaceサイズ unsigned long
-XX:CompressedClassSpaceSize CompressedClassSpaceのサイズ 1 (GB)
-XX:MinMetaspaceFreeRatio Metaspaceの最小拡張単位 40 (%)
-XX:MaxMetaspaceFreeRatio Metaspaceの最大拡張単位 70 (%)
-XX:MinMetaspaceExpansion GC後の最小Free領域割合 256 (KB)
-XX:MaxMetaspaceExpansion GC後の最大Free領域割合 4 (MB)
-XX:UseLargePagesInMetaspace ラージページを使用するか false
-XX:TraceMetadataHumongousAllocation 巨大ObjectのAllocateをTraceするか false
-XX:InitialBootClassLoaderMetaspaceSize BootClassLoader用のMetaspace初期値 4MB(LB)、2200KB

★「-XX:MetaspaceSize」ではMetaspaceのサイズを指定できない!!!

ぶっちゃけ全然わからん。
とりあえずMetaspace関係は下記のオプションをつけておく。

  • Javaヒープ32GB未満
    • 「-XX:MaxMetaspaceSize=[Permに設定してたのと同じくらい]」
    • 「-XX:CompressedClassSpaceSize=100m」
  • Javaヒープ32GB以上
    • 「-XX:MaxMetaspaceSize=[Permに設定してたのと同じくらい]」

参考:
https://speakerdeck.com/nulabinc/java-8-falsehipumonitaringu
http://www.slideshare.net/YaSuenag/metaspace
http://www.slideshare.net/tanago3/jvm-internal