Java 8 は、動的に拡張できるメタスペースを使用します。メタスペースがいっぱいになると、GC はメタスペースで実行されます。それは、GC がメタスペースで実行されないということですか?
Java 8 アプリケーションが大量のメモリを使用しています。実行時のメタスペースのサイズを知りたいです。それ、どうやったら出来るの?
設定を考えていますMaxMetaspaceSize
。何に設定すればよいですか?推奨事項はありますか?
オプション1:
実行する
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
これによると、興味深いのは次のとおりです。
MC: Metaspace capacity (kB)
MU: Metaspace utilization (kB)
したがって、この場合、約 181 MB のメタスペースがコミットされ、現在 137 MB が使用されています。
オプション 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 (ホストの構成によって異なります) では不十分であることがわかっている場合は、適切な開始値を構成することをお勧めします。
メタスペース サイズの調整の詳細については、こちらを参照してください。
for (MemoryPoolMXBean memoryMXBean : ManagementFactory.getMemoryPoolMXBeans()) {
if ("Metaspace".equals(memoryMXBean.getName())) {
System.out.println(memoryMXBean.getUsage().getUsed()/1024/1024 + " mb");
}
}
はい、MaxMetaspaceSize
監視して修正するのが漏れていると思われる場合は、設定することをお勧めします。
jcmd を使用します。これは、Java 8 でこのようなものを見つけるための最適な組み込みのオラクル ツールです。ターミナルから...
注: Java プロセスを開始したユーザーとして jcmd を実行する必要があります。Jetty のような Web サーバーをデバッグしている場合は、ユーザーを のように変更する必要があるかもしれませんsudo su jetty
。