3

JRockit と比較して、Sun の JVM で取得した最大ヒープ サイズに奇妙な動作が見られます。

64 ビット システム (Ubuntu 11.04) の 64 ビット VM で IDEA を実行しています。私がテストしている JVM のバージョンは次のJava HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)とおりapt-get install sun-java6-jdkですOracle JRockit(R) (build R28.1.3-11-141760-1.6.0_24-20110301-1432-linux-x86_64, compiled mode)

パラメータ -Xms1g -Xmx3g を渡すと、IDEA は、Sun の JVM で 1820M、JRockit で (予想どおり) 3072M の最大ヒープ サイズを報告します。

-Xms2g -Xmx4g を渡すと、IDEA は Sun では 3640M、JRockit では 4096M を報告します。

何が起こっている?それらの神秘的な数字 1820M と 3640M = 2*1820M は何ですか? Sun の JVM を必要な正確なヒープ サイズで実行することはできませんか?

編集:

回答が削除されたので、コメントを元に戻します。現在のサイズではなく、MAX サイズについて話していることに注意してください。ここで質問する前によく調べたので、Xms、Xmx、またはメモリの領域のサイズを指定するその他のパラメーターの意味を教える必要はありません (これらは他の場所で見つけることができます)。 .

EDIT2:

この動作をテストするために、次の簡単なコードを書きました。

public static void main(String[] args) throws Exception {
  while (true) {
    final Runtime r = Runtime.getRuntime();
    System.out.println("r.freeMemory() = " + r.freeMemory()/1024.0/1024);
    System.out.println("r.totalMemory() = " + r.totalMemory()/1024.0/1024);
    System.out.println("r.maxMemory() = " + r.maxMemory()/1024.0/1024);
    Thread.sleep(1000);
  }
}

次に、-Xmx100m、-Xmx110m、-Xmx120m などを使用して、Sun の JVM と JRockit の両方でさまざまな値を指定して実行しました。Sun は常に奇妙な値を報告し、maxMemory()実行間の大きなステップ (30M など) で成長します。JRockit は毎回正確な値を報告しました。

4

1 に答える 1

0

XmsXmxは、割り当てられたヒープの最小サイズと最大サイズを示すためにのみ 使用されます。JVM は、特にオブジェクト割り当てイベントまたはガベージ コレクション イベント中にヒープのサイズを変更できるため、割り当てられたヒープの実際のサイズは、最小値と最大値の間の値になる可能性があります。

JVM で「正確な」ヒープ サイズを使用する必要がある場合は、互いに十分に近い値を指定Xmsして、ヒープのサイズ変更が発生しないようにすることができます。Xmxもちろん、これらの値は連続する空きメモリ量に対応している必要があります。

上記のセクションは別のことを想定しているため、実際には無視できます。

ヒープ サイズの計算に使用されるコードに基づいて、Hotspot JVMRuntime.maxMemory() の Xmx フラグで渡された値に対応しない値を返すことに注意してください。ドキュメントは、JVM が使用できるメモリを示す値を返すだけであると曖昧に述べています。

投稿されたコードの動作から推測すると、ヒープのサイズを変更すると、さまざまな呼び出しに対してさまざまな値が報告されますRuntime.maxMemory()Xmxまた、JRockit JVM がフラグを介して渡された値を報告することは言うまでもありません。

于 2011-08-17T15:28:03.400 に答える