7

私は Java 5 を使用しており、カスタム サーバー アプリケーションには GC チューニングが必要です。ピーク時に 15 ~ 20 秒の一時停止が発生することがあります。次のようなJVM引数を持つサーバークラスマシンでJava 5を実行しています-server -d64

JVM が現在使用している GC アルゴリズムを確認する方法はありますか?

http://docs.oracle.com/javase/1.5.0/docs/guide/vm/gc-ergonomics.html

サーバー VM を実行しているサーバー クラスのマシンでは、ガベージ コレクター (GC) が以前のシリアル コレクター ( -XX:+UseSerialGC) からパラレル コレクター ( -XX:+UseParallelGC) に変更されました。-XX:+UseSerialGCjava コマンドのコマンド行オプションを使用して、このデフォルトをオーバーライドできます。

1) 私が知りたいのは、それが本当に起こっていることですか?

私の次の質問は、コマンドライン引数に次を追加したことです

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -Xloggc:logs/gc.log

2) GC ログのロギングを除いて、実行中の JVM のパフォーマンスまたは動作に影響がありますか?

4

5 に答える 5

6

-XX:+PrintFlagsFinal を使用して、JVM パラメータとその設定を出力できます。

java -XX:+PrintFlagsFinal -server -version

于 2012-10-15T23:29:21.350 に答える
3

jmap -heap <jvm_pid>Javaヒープの概要を印刷するために使用できます。たとえば、Intellij のヒープ サマリーは、次のように実行すると次のようになりますjmap -heap 2592

プロセス ID 2592 にアタッチしています。お待ちください...
デバッガーが正常にアタッチされました。
サーバー コンパイラが検出されました。
JVM のバージョンは 25.101-b13 です

新世代の並列スレッドを使用します。
スレッド ローカル オブジェクト割り当てを使用します。
コンカレント マーク スイープ GC
トランケート...

出力からわかるように、2592 プロセス ID で実行されている JVM インスタンスはCMS GC アルゴリズムを使用しています。

また、アルゴリズムがこれらの-XX:+Use*GCフラグによって決定された場合は、jcmd <pid> VM.flags. 例えば:

$ jcmd 2715 VM.flags 
2715:
-XX:CICompilerCount=4 -XX:InitialHeapSize=268435456
-XX:MaxHeapSize=734003200 -XX:MaxNewSize=244318208 
-XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 
-XX:+UseCompressedClassPointers -XX:+UseCompressedOops 
-XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 

ご覧のとおり、VM はParallel GCを使用しています。

于 2017-01-10T10:54:34.683 に答える
1

GarbageCollectorMXBeansを使用して、現在使用中の gc を取得できます。

そして、ほぼすべてのロギングがパフォーマンスに影響を与えます。

于 2012-02-15T18:31:06.667 に答える
1

Visual VM をプロセスに接続し、mbeans を調べます。以前に使用したことがない場合 (Oracle JDK ダウンロードの一部です)、おそらく MBean プラグインをインストールする必要があります (これは簡単です)。

http://docs.oracle.com/javase/6/docs/technotes/guides/visualvm/

http://visualvm.java.net/mbeans_tab.html

于 2012-02-15T18:38:06.367 に答える
0

GCが問題になりつつある場合は、 Java RTS(リアルタイムシステム)を調べることをお勧めします。

Java RTSを使用すると、GCがいつ機能するかを正確に制御できます。つまり、最悪のシナリオを完全に制御できるため、可能な限りストレスフルな状態でシステムがどのように動作するかをシミュレートできます。

于 2012-02-15T18:25:33.997 に答える