outOfMemory エラーで奇妙な問題が発生しました。私はいくつかの部分でメモリ使用量が多いアプリケーションを作成しました。私のラップトップ(Linux、64ビット、Eclipse indigo、vmargs:xms:40、xmx:512、4GBの物理RAM)では、アプリケーションは問題なく実行されます..別のPC(WinXP SP3、32ビット、Eclipse juno、vmargs:xms:40) 、xmx:1024(!)、2 GB の物理 RAM) アプリケーションは、タイトルに記載されているエラーで終了します。両方のマシンが Oracle の Java 7 jdk を使用しています。私のラップトップよりも多くのヒープスペースを持つ別のPCでアプリケーションが失敗する可能性はありますか。私はラップトップでアプリケーションを開発しました...しかし、これがこのエラーの原因ではないと思いますよね?
2 に答える
Hotspot Java の 32 ビット バージョンと 64 ビット バージョンでは、ヒープのデフォルトの最大サイズを決定する方法について異なるポリシーがあります。32 ビット JVM では、固定のデフォルト ヒープ サイズが使用されます。64 ビット JVM では、ヒープ サイズはシステムの物理メモリの量によって異なります。
java
解決策は、コマンドの-Xmx
オプションを使用して最大ヒープ サイズを明示的に設定することです。
あなたの場合、すでに -Xmx 引数を使用しており、(明らかに) 32 ビット プラットフォームでより大きな値を使用しています ... そして 32 ビット バージョンが最初に死んでいます! 考えられる説明はいくつか考えられます (可能性は低くなりますが):
32 ビット マシンには十分なスワップ スペースがなく、JVM がヒープを拡張しようとしたときにメモリの追加要求を満たすことができません。
あなたのアプリケーションは、利用可能なメモリの量を把握し、それに応じて動作を調整しています...しかし、メモリが大きい場合にはそれが間違っています。
2 つのシナリオでは、アプリケーションへの入力に多少の違いがあり、それが問題の原因となっています。
アプリケーションは、アドレス空間のかなりの部分を使用しているメモリ マップ ファイル (またはそのようなもの) を使用しています ... ヒープに使用できるアドレス空間を減らしています。64 ビット マシンでは数ギガバイトのアドレス空間がありますが、32 ビット Windows XP マシンでは、アプリケーションのアドレス空間は OS と命令セット/ハードウェア アーキテクチャによって最大 2Gb に制限されます。
(問題の説明の変更は役に立ちません...)
Eclipse からアプリケーションを起動する場合、Eclipse JVM で使用される -Xmx 設定と、アプリケーションを実行する JVM で使用される -Xmx 設定を混同している可能性があります。アプリケーションのランチャー構成で -Xmx オプションを明示的に設定しない場合は、デフォルトのヒープ サイズが使用されます。
あなたのコメントに応えて:
しかし、Eclipseプラグインである別のプロジェクトにjarとして含まれるアプリケーションを実装する必要があります..
Eclipse プラグインの場合、JVM サイズは親 Eclipse によって決まります。あなたのプラグインはこの問題について発言権を持っていません。プラグインが多くのヒープ スペースを必要とする場合は、ユーザーに手動で Eclipse ヒープ パラメータを調整してもらう必要があります。
その Eclipse インスタンスを別の Eclipse インスタンスから起動している場合 ... アプリケーション ランチャーのパラメーターが何らかの影響を与えるかどうかはわかりません。しかし、これはあなたのプラグインを開発しているあなた (および他の人) にとってのみ重要です。
(実行可能な JAR ファイルの場合、JAR マニフェストでヒープ サイズを指定することはできません。ただし、他にもオプションがあります - Can I set Java max heap size for running from a jar file? を参照してください。)
すべてのOutOfMemoryErrorsが同じというわけではありません。OutOfMemoryErrorはから取得できます
- ヒープスペースの不足
- GCが多すぎます。
- パーマの不足
- スタックスペースの不足(新しいスレッドを作成するため)
- スワップスペースの不足
- 他の人は私が忘れました。
実際のエラーを確認する必要があります。WindowsXPでは合計で約1.5GBしかないため、仮想メモリが不足していると思われます。
最大ヒープサイズを小さくすると、空き仮想メモリが増えるため、この問題が修正される場合があります。
自分が思っている最大値を実際に設定していることを確認する必要があります。64ビットサーバーのJVMでは、デフォルトで問題ない場合があります(この場合、デフォルトを設定する必要はありません)。32ビットのクライアントJVMでは、デフォルトはかなり適切です。