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が解放される
■動き
- Metaspaceからメモリを取ろうとする
- 今あるメモリから取ろうとする
- Metaspaceの要領調整(■前提の3)で取ろうとする
- FullGCを起こす
- 使用されていないクラスローダを破棄する
- Metaspaceの要領調整(■前提の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