3

以下で観察したJavaアプリケーションを実行しています:

コードを介して、メモリ使用率を計算しています:

long freeMemory = Runtime.getRuntime().freeMemory();
this.memUsage = 100f - (freeMemory*100)/this.maxMemory;
where
instance.maxMemory = Runtime.getRuntime().maxMemory();

タイムスタンプ S0 S1 E O P YGC YGCT FGC FGCT GCT

2849.6 0.00 84.80 93.14 16.95 60.00 483 140.140 8 3.649 143.789

まず第一に、私のコードはどのメモリを表示します.Old、Eden、または Survivor.I think Old..mi rgt ??

特定の時点で、私のコードが jstat の古いメモリ使用率と比較して異なる出力を与えることを観察しています。ここの jstat old show のように、約 17% で、私のコードは 20% を示しています。これには何か理由がありますか??

4

1 に答える 1

1

私の知る限り、ランタイム メモリ メソッドは、HEAP についてのみ合計として報告します (したがって、すべての値は、old、eden、survivor、および permanent の合計です)。これが、全体的なヒープ使用率を示す jstat 出力がないため、値がオフになる理由です。

注意すべきことの 1 つRuntime.freeMemory()は、完全に正確ではない可能性があることです。メソッドのjavadocから:

将来割り当てられるオブジェクトに現在使用可能なメモリの総量の概算をバイト単位で返します。

私は、メモリに関して Runtime クラスから返される値を信頼しない傾向があります。jconsole や jstat などの外部コマンドを使用してメモリ統計を取得するか-Xloggc、Java プログラムの起動時に使用します。これらの方法は、私が見たどの API メソッドよりもメモリ使用量を監視するのにはるかに信頼性があります。

于 2013-01-01T14:29:33.597 に答える