3

私が対処しなければならない 1 つのアプリケーションは、ProcessBuilder. 理由は語られていませんが、基盤となる OS が 64 ビット (RHEL 5.x の価値がある) であっても、32 ビット JVM (Sun、1.6.0.25) で実行されます。

このアプリケーションはメモリを多用するため、ヒープ サイズは最大 3 GB に設定され、permgen は 128M です。

ただし... ランダムな瞬間に、シェル ヘルパーの起動に失敗します。OutOfMemory が原因ではなく、ENOMEM が原因です... これについて私が確認できる唯一の原因は、アドレス空間の不足です。

確かに、しかし同時に、メモリは実際には圧迫されておらずtop、JVM とその仮想セットのサイズの実際のメモリ使用量は 3 GB でさえないことが報告されています...

のコードを見ることができるものProcessを見ると、コア メソッドが呼び出されてforkAndExec()いることがわかります。これは、ほとんど自明です...両方のシステムコールについて知っていることから、失敗するべきではありません。しかし、そうです。そして、常にではありません。

なんで?

編集:neo4jが使用されていることに注意してください。FileChannel を多用しているようですが、それがアドレス空間不足の原因でしょうか?

4

2 に答える 2

1

ヒープサイズを小さくします。実際に使用されるヒープの量は、フォークされたプロセスを実行するためのスペースをますます少なくする可能性があります(親からリソースを継承します)

64ビットJVMにアップグレードするだけで問題が解決する可能性が高いです。代わりに、Java 6 update 30 64ビットを試してみてください(問題が解決するかどうかを確認するため)。原因が何であるかについての詳細(そして、切り替える価値があるかどうかを判断できます)

于 2012-01-06T08:15:58.823 に答える
1

Linux メモリのオーバーコミットがプロセスを強制終了することに悩まされていると思います。そのブログ投稿では、調整可能な sysctl 変数が提案されています。

于 2012-01-06T00:08:25.210 に答える