web-dev-qa-db-ja.com

java 8実行時にメタスペースのサイズを調べる

Java 8は、動的に拡張できるメタスペースを使用します。 GCは、いっぱいになるとメタスペースで実行されます。つまり、GCがメタスペースで実行されることはありませんか?

私のJava 8アプリケーションが大量のメモリを使用しています。実行時のメタスペースのサイズを知りたいのですが、どうすればよいですか?

MaxMetaspaceSizeの設定を考えています。何に設定すればよいですか?何かお勧めですか?

15
riship89

オプション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 を参照してください。

14
geld0r
for (MemoryPoolMXBean memoryMXBean : ManagementFactory.getMemoryPoolMXBeans()) {
    if ("Metaspace".equals(memoryMXBean.getName())) {
            System.out.println(memoryMXBean.getUsage().getUsed()/1024/1024 + " mb");
    }
}

はい、監視して修正するのが面倒だと思われる場合は、MaxMetaspaceSizeを設定することをお勧めします。

12
Jigar Joshi

Jcmdを使用します。これは、Java 8.でこのようなものを見つけるのに最適な組み込みOracleツールです。ターミナルから...

注:Javaプロセスを開始したユーザーとしてjcmdを実行する必要があります。JettyのようなWebサーバーをデバッグしている場合は、Sudo su jettyのようなユーザーに変更する必要があります。

  1. jcmdを実行します
  2. アプリに表示されたPIDを取得し、jcmd <pid> VM.native_memoryenter image description here これは
  3. その他のオプションについては、jcmd <pid> helpを実行してください
1
Jim Chertkov