2

簡単なプログラム:

public class SleepTest {
    public static void main(String[] args) throws InterruptedException {
        Thread.sleep(60 * 1000);
    }
}

それで

$ javac SleepTest.java 
$ java -cp . SleepTest

OpenJDK 1.6.0_20の場合、これは私のマシンで600Mの仮想メモリを使用します。つまり、「top」は「VIRT」600MとRES10mを示しています。(私はUbuntu 10.04、32ビットまたは64ビットを使用しています)。

SunのJava1.6.0_22の場合、400Mの仮想メモリを使用します。

そのすべての仮想メモリを使用しているのは何ですか?また、その使用量を減らすにはどうすればよいですか?

完全な「javaバージョン」:

OpenJDK:

java version "1.6.0_20"
OpenJDK Runtime Environment (IcedTea6 1.9.4) (6b20-1.9.4-0ubuntu1~10.04.1)
OpenJDK Client VM (build 19.0-b09, mixed mode, sharing)

太陽:

$ /usr/lib/jvm/java-6-sun-1.6.0.22/jre/bin/jav -version
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Java HotSpot(TM) Client VM (build 17.1-b03, mixed mode, sharing)

編集

どちらのパッケージからもjavacを使用してコンパイルしても、役に立たないようです。

使用済みメモリを印刷するためのコードの追加は次のとおりです。

private static String megabyteString(long bytes) {
    return String.format("%.1f", ((float)bytes) / 1024 / 1024); 
}
private static void printUsedMemory() {
    Runtime run = Runtime.getRuntime();
    long free = run.freeMemory();
    long total = run.totalMemory();
    long max = run.maxMemory();
    long used = total - free;
    System.out.println("Memory: used " + megabyteString(used) + "M"
            + " free " + megabyteString(free) + "M"
            + " total " + megabyteString(total) + "M"
            + " max " + megabyteString(max) + "M");
}

ショー

太陽:

Memory: used 0.3M free 15.2M total 15.5M max 247.5M

OpenJDK:

Memory: used 0.2M free 15.3M total 15.5M max 494.9M

-Xmx5mでも、最小値が必要ですか?以前にデフォルトについて読んだことがあります(jvm、仮想マシン、デフォルトでは物理メモリの4分の1の一般的な戦略に依存します)が、それが大量の仮想メモリの使用を引き起こし、それを減らすことはできませんか?

編集#2

-Xmxを追加すると、状況が変わります。

$ java -Xmx5m -cp . SleepTest

OpenJDK:

$ java -Xmx5m SleepTest
Memory: used 0.2M free 4.7M total 4.9M max 5.8M

いずれかのJVMに「のみ」150Mの仮想メモリを使用します。

編集#3

nos、bestsss、Mikaveli、およびおそらく他の人は、仮想メモリはスワップを使用しないと指摘しました。nosは、OOMキラーは実際のメモリ使用量で十分に賢いと主張しています。これらのことが当てはまる場合、仮想メモリの使用量は気にしないと思います。RES(レジデントサイズ)が小さいのでいいです。

編集#4

どちらの答えを受け入れるべきかわからない。これらのいずれかが答えとして表示された場合:「仮想メモリは安価なので心配しないでください」またはJavaが-Xmxまたは-Xmsを指定しても、仮想メモリに少なくとも150Mを予約する理由の説明実際のメモリ使用量はごくわずかですが。

編集#5

これは重複です。私は閉じることに投票しました。

4

4 に答える 4

1

「RES」は常駐セットサイズです。基本的に、そのプロセスに使用している物理メモリです。

あなたの例から、topは10 MiBを使用していると述べています。これは、5mの-Xmx設定に期待するものとほぼ同じです(* nixシステムでのJavaの経験から、使用される物理メモリの合計は2倍になることがよくあります。

実際にメモリの問題が発生していますか、それとも「トップ」からの誤解を招く出力について心配していますか?

また、* nix仮想メモリには、使用可能なメモリスペース(物理およびスワップ)が含まれます。プロセスが「スワップ」を使用していない場合は、物理的な「常駐」メモリのみを使用しています。

JVMが単なるヒープ設定よりも多くのメモリを使用する理由に対するスタックオーバーフローの答え。

于 2011-01-31T16:07:36.607 に答える
1

$java-cp。SleepTest -Xmx5m

おお!-Xmx5mは、で見つけることができる引数ですpublic static void main(String[] a)これは、VMではなくJavaプログラムのパラメータです。

1番目に移動します $ java -Xmx5m -cp . SleepTest

于 2011-01-31T16:16:36.107 に答える
0

-Xmsを使用して最小メモリを指定してみてください。

于 2011-01-31T16:01:50.343 に答える
0

JVMは、カウントでヒープスペース(つまり、すべてのメモリ使用量)に対していくつかのデフォルトを取ります。このデフォルトは、マシンの特性(RAM、コアなど)とJVMの実装(Sun / Oracle、OpenJDK)に由来します。

-Xmx5mは低すぎると思いますが、JVMはこのパラメーターを黙って無視します。

読むべきリンクがたくさんある良いリファレンスは次のとおりです。

Javaメモリの説明(SUN JVM)

于 2011-01-31T16:05:55.313 に答える