33

Java で作成された単純なアプリケーションがいくつかあります。そのうちの 1 つはウィジェットとして機能するように作成されています。小さなアプリケーションでさえ、どれだけの RAM を使用するかに驚いたのです。

それが私のプログラムのバグなのか、それとも一般的なJavaの問題なのかを確認するために、次のように書きました。

public class ram {
    public static void main(String[] args){
    while(true)System.out.print("Hello World");//while loop to give me time to check RAM usage
    }
}

次に、コンパイルして実行するとjava ram、次のRAM使用量が得られました。

The process java (with pid 4489) is using approximately 43.3 MB of memory.
34460 KB    [heap]
7088 KB /usr/lib/jvm/java-7-openjdk/jre/lib/amd64/server/libjvm.so
1712 KB /usr/lib/jvm/java-7-openjdk/jre/lib/rt.jar
136 KB  [stack:4495]
120 KB  /usr/lib/jvm/java-7-openjdk/jre/lib/amd64/libjava.so

これ高すぎない?特に 34MB のヒープ。私のシステムは ArchLinux x86_64 と openjdk-7 です。

JVM が使用する RAM の量を最小限に抑える方法はありますか?

編集: -Xmx フラグを使用してみましたが、これが得られたものです(1281kが最小でした):

java -Xmx1281k ram
The process java (with pid 4987) is using approximately 27.6 MB of memory.
18388 KB    [heap]

比較のために、Python2 は 4.4MB を使用し、Mono は 4.3MB を使用します。

4

2 に答える 2

10

これにはいくつかの理由があります。

  1. Java ランタイムは、それ自体がかなり複雑なプログラムです。Java プログラムのバイト コード (javac からの出力) を取得し、それを実行しているシステムのマシン コードに変換する必要があります。そのためのオプティマイザがあり、デバッグ用のインターフェイスなどがあります。
  2. プログラムはかなり小さいですが、Java は標準ライブラリから多くのクラスをロードします。これは、「java -verbose:class ram」を使用して起動することで確認できます
  3. Java は事前にプログラムに大量のメモリを割り当てます。実際に必要なメモリ量はわかりません。これは、特に -Xmx オプションによって制御されます。このようなメモリにはいくつかの種類があります。それらについて詳しく調べるには、JDK の bin フォルダーに含まれている JConsole ツールを使用できます。詳細については、java.sun.comを参照してください。Java が使用するメモリ領域の概要は、このスタックオーバーフローの質問にも記載されています
于 2013-03-24T16:57:11.213 に答える