5

大量のヒープ スペースを必要とする Java プログラムがあります。(他のコマンド ライン引数の中で) 引数 -Xmx1500m で開始します。これは、1500 MB の最大ヒープ スペースを指定します。新たに再起動した Windows XP ボックスでこのプログラムを起動すると、問題なく起動して実行されます。しかし、プログラムが数回実行された場合、コンピューターがしばらく起動していた場合など、起動しようとすると次のエラーが発生します。

VM の初期化中にエラーが発生しました
オブジェクト ヒープに十分なスペースを予約できませんでした
Java仮想マシンを作成できませんでした。

Windows自体がメモリの断片化に苦しんでいると思われますが、この疑いを確認する方法がわかりません. これが発生した時点で、タスク マネージャーと sysinternals procexp は 2000MB の空きメモリを報告します。内部フラグメンテーションに関連するこの質問を見てきました

最初の質問は、どうすれば自分の疑いを確認できるでしょうか? 2 番目の質問は、私の疑いが正しければ、この問題を解決するツールを知っている人はいますか? かなり調べましたが、マシンを定期的に再起動する以外に役立つものは見つかりませんでした。

ps - オペレーティング システムを変更することも、現在実行可能なオプションではありません。

4

6 に答える 6

2

ページ ファイル領域が不足している場合を除き、この問題はコンピューターのメモリが不足しているということではありません。仮想メモリの要点は、プロセスが物理的に利用可能な仮想メモリよりも多くの仮想メモリを使用できるようにすることです。

JVM がヒープをどのように処理するかがわからないため、問題が何であるかを正確に言うのは少し難しいですが、一般的な問題の 1 つは、ヒープを拡張できるように、プロセスで使用できる連続した空きアドレス空間が十分にないことです。 . マシンがしばらく実行された後にこれが問題になる理由は少しわかりにくいです。

私は職場で同様の問題に取り組んできました。WinDBG を使用してプログラムを実行し、「!address」および「!address -summary」コマンドを使用すると、プロセスの仮想アドレス空間が断片化された理由を追跡するのに非常に役立つことがわかりました。また、再起動後にプログラムを実行し、「!address」コマンドを使用してアドレス空間の写真を撮り、プログラムが実行されなくなったときに同じことを試すこともできます。これにより、問題のヒントが得られる可能性があります。おそらく、追加の DLL が読み込まれるという単純なことが問題を引き起こす可能性があります。

于 2008-09-19T17:30:10.023 に答える
2

Torlack に同意します。これの多くは、他の DLL がロードされて特定の場所に入り、VM 用に取得できるメモリの量が 1 つの大きなチャンクに分割されるためです。

メモリが 3G 以上ある場合は、WinXP でいくつかの作業を行うことができます。これにより、Windows の一部を移動することができます。ここで PAE を検索してください: http://www.microsoft.com/whdc/system/platform/server/PAE/ PAEDrv.mspx

Java アプリに 1.2G を超えるメモリが本当に必要な場合は、64 ビットの Windows、Linux、または OSX を検討するのが最善の策です。アプリで何らかの種類のネイティブ ライブラリを使用している場合は、それらを 64 ビット用に再コンパイルする必要がありますが、DLL などをリベースして 32 ビット ウィンドウで取得できるメモリを最大化するよりもはるかに簡単です。 .

別のオプションは、プログラムを複数の VM に分割し、RMI やメッセージングなどを介して相互に通信させることです。そうすれば、各 VM は必要なメモリのサブセットを持つことができます。あなたのアプリが何をするかわからないので、これが何らかの形で役立つかどうかはわかりません...

于 2008-09-19T17:38:02.610 に答える
2

問題は Windows メモリの断片化だと思います。Windows XP の Java 最大メモリと呼ばれる StackOverflow に関する別の質問があります。この質問では、Process Explorer を使用して DLL がメモリにマップされている場所を確認し、DLL をリベースして問題に対処し、よりコンパクトな方法でメモリにロードすることについて言及しています。

于 2009-05-19T13:55:35.663 に答える
0

Microsoft の SysInternals ツールの vmmap を使用して、仮想アドレス空間の断片化を表示し、空間を分割しているものを特定します

于 2011-10-11T09:54:49.240 に答える
0

そのアプリケーションにMinimem ( http://minimem.kerkia.net/ ) を使用すると、問題が解決する場合があります。ただし、これがあなたが探している答えであるかどうかはわかりません。お役に立てば幸いです。

于 2008-09-19T17:19:40.720 に答える
0

おそらく、プログラムを開始してメモリを予約し、実行ごとに VM を終了しないことを検討する必要があります。別の GC オプションを探して、オブジェクトを解放します。

于 2008-09-19T17:20:19.363 に答える