15

64 ビット サーバーの MetaspaceSize の既定値は? 公式ドキュメントでは見つかりませんでした。

サーバー JVM プロセスでは、GC の頻度が高くなり、増加し続けることがあります。サービスを数回再起動すると、安定に戻ります。JREのアップグレードによるものだと思います。

JVM ヒープの最大サイズは 6GB に設定されていますが、この問題が発生すると、3GB のヒープしか使用されていません。メタスペースはほとんど増加せず、ほぼ常に満杯です。メタスペースを 1GB に増やしてみたところ、スループットが向上しました。

起こっていることは、メタスペースがデフォルトで非常に低い値に設定されているため、GC が開始されることだと思います。GC が発生するたびに、最高水準点が継続的に (再び非常に低い量で) 増加します。

MetaspaceSize を設定したい (現在の値がわからない)。

Oracle のドキュメントによると、MetaspaceSize を何に設定するかを知るためのガイドラインはありません。しかし、それを設定する正しい値を見つける方法はありますか?

Oracle ドキュメントから得た 1 つのヒントは次のとおりです。

If the committed space available for class metadata as a percentage of the total committed space for class metadata is greater than MaxMetaspaceFreeRatio, then the high-water mark will be lowered. If it is less than MinMetaspaceFreeRatio, then the high-water mark will be raised.

しかし、GC を安定させる方法がまだわかりません。3 つの質問があります。

  1. 64 ビット サーバーのデフォルトの MetaspaceSize はいくつですか?
  2. デフォルトの比率: MaxMetaspaceFreeRatio、MinMetaspaceFreeRatio は何に設定されていますか? 答え: Min が 40、Max が 70 であることを示しています
  3. Metaspacesize 値を決定するにはどうすればよいですか?
4

3 に答える 3

8

最も興味深い質問は 3 だと思いますので、最初にその質問にお答えします。私がアプローチした方法は、次の設定を使用して gc ロギングをオンにして、アプリケーションを 24 時間実行することでした。

-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCCause
-XX:+PrintTenuringDistribution
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCApplicationConcurrentTime
-Xloggc:gc.log

それから私はこれをしました:

grep Metaspace gc.log

そして、「使用済み」の値が急速に 80M に増加したことを確認したので、MetaspaceSize を 100M に設定しました

-XX:MetaspaceSize=100M

出来上がり - メタスペースによる gcs はもうありません。

@Pillarのコメントは、実装のデフォルトのメタスペース設定を決定する方法に関する最初の2つの質問にほとんど答えたようです...完全を期すためにここに含めます:

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version -XX:+UseG1GC | grep Metaspace

技術的には、@Pillar のコメントは 64 ビット サーバーのデフォルトのメタスペース サイズを示していませんが、ドキュメントによるとこれらのデフォルトは実装ごとに異なるため、最初の質問が少し誤解を招くためです。

見る:

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html

具体的には、一番下の「MetaspaceSize のデフォルト サイズはプラットフォームに依存し、12 MB から約 20 MB の範囲です」とある部分

于 2017-09-27T17:39:16.173 に答える