Java 8は、動的に拡張できるメタスペースを使用します。 GCは、いっぱいになるとメタスペースで実行されます。つまり、GCがメタスペースで実行されることはありませんか?
私のJava 8アプリケーションが大量のメモリを使用しています。実行時のメタスペースのサイズを知りたいのですが、どうすればよいですか?
MaxMetaspaceSize
の設定を考えています。何に設定すればよいですか?何かお勧めですか?
オプション1:
Execute
jstat -gc PID
(PIDを監視するJVMのPIDに置き換えて)sthを返します。お気に入り:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
103936.0 107008.0 0.0 41618.3 820736.0 401794.3 444928.0 183545.7 181888.0 137262.8 28544.0 20386.6 313 16.024 8 3.706 19.729
興味のある this によると:
MC: Metaspace capacity (kB)
MU: Metaspace utilization (kB)
したがって、この場合、メタスペースの約181mbがコミットされ、現在137mbが使用されています。
オプション2:
ガベージコレクションログを有効にしている場合は、そこから確認することもできます。アプリケーションがすでにクラッシュした後、または問題が報告された後。次のような行を検索
2016-04-06T01:50:04.842+0200: 7.795: [Full GC (Metadata GC Threshold)
[PSYoungGen: 7139K->0K(177152K)]
[ParOldGen: 18396K->22213K(101888K)] 25535K->22213K(279040K),
[Metaspace: 34904K->34904K(1081344K)], 0.1408610 secs]
[Times: user=0.45 sys=0.00, real=0.14 secs]
これは、前のしきい値に達したときのメタスペースのサイズ変更を構成します。
[Metaspace: 34904K->34904K(1081344K)], 0.1408610 secs]
関連情報が含まれています:34,9mbはGCの前と後に使用されました。見つけることができるこれらの最新のログエントリは、現在のサイズを示します(つまり、GCの後)。
メタスペースのサイズが変更されるたびにフルGCが実行されることに注意してください。したがって、デフォルト値の〜21mb(ホスト構成によって異なる)では不十分であることがわかっている場合は、これに適切な開始値を構成することをお勧めします。
メタスペースサイズのチューニングの詳細については、 this を参照してください。
for (MemoryPoolMXBean memoryMXBean : ManagementFactory.getMemoryPoolMXBeans()) {
if ("Metaspace".equals(memoryMXBean.getName())) {
System.out.println(memoryMXBean.getUsage().getUsed()/1024/1024 + " mb");
}
}
はい、監視して修正するのが面倒だと思われる場合は、MaxMetaspaceSize
を設定することをお勧めします。