2009-07-01 6 views
3

私はむしろメモリが空いているJavaアプリケーションを持っています。 Windows XP Professionalを搭載した私の32ビットシステムでは、-Xmx1280mとすればアプリケーションは正常に動作します。以下のすべてがjava.lang.OutOfMemoryError: Java heap space例外になります。64ビットシステムで32ビットプロセスを実行すると、それ以上のメモリが必要ですか?

同じアプリケーションを64ビットWindows XP Professional上で実行する場合は、OutOfMemory条件を防ぐために-Xms1400mが必要です。

私はCプログラムを持っていて、それを32ビットと64ビット用にコンパイルすると、 の64ビットバージョンはポインタが広くなるなどの理由で、より多くのメモリが必要になります。 しかし私のJavaの例では、仮想マシン(Sun)は同じで、バイトコードも同じです。

なぜ64ビットマシンでより多くのメモリが必要ですか?

答えて

5

おそらく仮想マシンの実装が、より多くのメモリ(より広いタイプ、異なるGC)を消費するような方法で32/64ビットアーキテクチャ間で異なります。

バイトコードは、タスクを基になるシステムに渡すときには関係ありません。私は、とにかくJavaとメモリ効率が良いという2つの条件があるとは確信していません。P

+1

これは、32ビットモードで実行すると4バイト、64ビットモードでは8バイトのポインタを表すIntPtrクラスを持っているため、.NETでより明白です。 – Powerlord

+1

ええと、もし64ビットで違いがあったら、2GB以上は扱えると思っていますが、できません。 -Xmx1400mは、Javaが64ビットマシンで受け入れる最大値です。私は短所(メモリが肥大)ではなく、利点(より大きなプロセスアドレス空間)しか得られないようだ。 –

+1

あなたのためのJava私はそう思うが、私はJVM実装の詳細について知識がない。 –

4

バイトコードは同じですが、JVMはそれをマシンコードに変換します。したがって、Cと同じ理由で大きなメモリフットプリントが必要になります。

3

これはCプログラムのリストにあるのと同じ理由です。 64ビットシステムは大容量のメモリアドレスを使用しているため、「リークアイア」になっています(これは私がこれまで述べてきた言葉です)。

+3

「漏れ」はこれを記述するための非常に不正確な用語です。メモリリークはありません。ポインタはもっと大きいです。 –

関連する問題