More Related Content
Similar to Metaspace (20)
More from Yasumasa Suenaga (9)
Metaspace
- 3. 自己紹介
末永 恭正(すえなが やすまさ) @YaSuenag
某SIerでJavaやってるサンデープログラマー
OpenJDK Author(jdk9)
IcedTea Committer
HeapStats作ってます
http://icedtea.classpath.org/wiki/HeapStats/jp
- 23. 実証コード
import java.nio.file.*;
import java.util.jar.*;
public class MetaFlood{
public static void main(String[] args) throws Exception{
Path rtjar_path = FileSystems.getDefault().getPath(
System.getProperty("java.home"), "lib", "rt.jar");
try(JarFile rtjar = new JarFile(rtjar_path.toFile())){
rtjar.stream().filter(e -> !e.isDirectory())
.map(e -> e.getName())
.filter(n -> n.endsWith(".class"))
.map(n -> n.substring(0, n.length() - 6).replace('/', '.'))
.forEach(n -> { System.out.println(n);
try{
ClassLoader.getSystemClassLoader().loadClass(n);
}
catch(ClassNotFoundException ex){}
catch(OutOfMemoryError oome){
System.out.println(oome.toString());
throw oome;
}
});
}
}
}
- 24. OOMEを起こしてみる
$ /usr/local/jdk1.8.0_05/bin/java -XX:CompressedClassSpaceSize=1m MetaFlood
:
java.lang.OutOfMemoryError: Compressed class space
Exception in thread "main“
:
$ /usr/local/jdk1.8.0_05/bin/java -XX:-UseCompressedClassPointers
-XX:MaxMetaspaceSize=5m MetaFlood
:
java.lang.OutOfMemoryError: Metaspace
Exception in thread "main“
:
その1:CompressedClassSpace溢れ
その2:Metaspace溢れ
- 29. GCログの例
[Full GC (Metadata GC Threshold)
[PSYoungGen: 496K->0K(2560K)]
[ParOldGen: 388K->836K(6656K)] 884K->836K(9216K),
[Metaspace: 7292K->7292K(9216K)], 0.0123187 secs]
[Times: user=0.02 sys=0.00, real=0.01 secs]
[Full GC (Last ditch collection)
[PSYoungGen: 0K->0K(2560K)]
[ParOldGen: 836K->792K(6656K)] 836K->792K(9216K),
[Metaspace: 7292K->7292K(9216K)], 0.0134180 secs]
[Times: user=0.04 sys=0.00, real=0.02 secs]
※見やすく改行しています
Metaspaceが
足りなくて
GCが発生
GCしても
まだ足りないため
最後の悪あがき
- 33. jstat
-gcなどが使えます(単位は全部KB)
MC:Metaspace Capacity
MU:Metaspace Used
CCSC: Compressed Class Space Capacity
CCSU: Compressed Class Space Used
-gcmetacapacityというオプションもあります
メタスペースサイズとGC回数・時間の取得用
$ /usr/local/jdk1.8.0_05/bin/jstat -gc 7831
… MC MU CCSC CCSU …
… 4864.0 2377.7 512.0 258.0 …
- 34. jcmd
PerfCounter.printで細かく見れます
sun.gc.metaspace
sun.gc.compressedclassspace
$ /usr/local/jdk1.8.0_05/bin/jcmd 7831 PerfCounter.print
:
sun.gc.compressedclassspace.capacity=524288
sun.gc.compressedclassspace.maxCapacity=1073741824
sun.gc.compressedclassspace.minCapacity=0
sun.gc.compressedclassspace.used=264208
:
sun.gc.metaspace.capacity=4980736
sun.gc.metaspace.maxCapacity=1082130432
sun.gc.metaspace.minCapacity=0
sun.gc.metaspace.used=2434808
:
- 39. Native Memory Tracking (NMT)
細かい情報を簡単に知りたいときに最適
-XX:NativeMemoryTracking=[summary|detail]
取り方は2種類
-XX:+UnlockDiagnosticVMOptions と
-XX:+PrintNMTStatistics でjava終了時に取得
jcmd <PID> VM.native_memoryで外側から取得
Metaspaceは”Class”の部分です
- 40. jcmd VM.native_memory
$ /usr/local/jdk1.8.0_05/bin/jcmd 8858 VM.native_memory
8858:
Native Memory Tracking:
Total: reserved=2330153KB, committed=135365KB
:
- Class (reserved=1062006KB, committed=10102KB)
(classes #374)
(malloc=5238KB, #153)
(mmap: reserved=1056768KB, committed=4864KB)
:
インスタンス
クラス数
- 45. Metaspace関連オプション(-
XX)オプション 意味 デフォルト
UseLargePagesInMetaspace Metaspaceにラージペー
ジを使うか?
(UseLargePages必須)
false
TraceMetadataHumongousAllocation 大きなオブジェクトを
Metaspaceにアロケート
するのをトレースする
false
InitialBootClassLoaderMetaspaceSize ブートクラスローダ用
Metaspaceの初期値
LP64:4MB
それ以外:
2200KB
MetaspaceSize Metaspaceをリサイズさ
せるための閾値
環境依存
MaxMetaspaceSize 最大Metaspaceサイズ unsigned long
最大値
CompressedClassSpaceSize CompressedClassSpace
のサイズ
1GB
- 49. オプションをつける前に…
Metaspaceは連続空間ではない
1クラスローダ1メタスペース
ブートストラップ以外のクラスローダの初期サイズは
変更できない
○ InitialBootClassLoaderMetaspaceSize(デフォルト4MB)
CompressedClassSpaceはクラス情報「だけ」
シンボルやメソッドプロファイル情報などは別領域
長時間動作させていれば、Metaspace使用量はあ
る程度安定してくる(はず)
動的ロードをガンガン行う場合はワカラナイ…