簡単なプログラム:
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:
これは重複です。私は閉じることに投票しました。