2012-01-10 15 views
1

多くのメモリーを必要とするJavaプロセスを開始しようとしました。何らかの理由で、19G以上のRAMをプロセスに指定しても機能しません。私が23Gの空きメモリを持っていることを示すフリーとトップは、このエラーがなぜ発生するのか不思議です。システムには十分なメモリーがありますが、「オブジェクト・ヒープに十分なスペースを確保できませんでした」

  total  used  free  shared buffers  cached 
Mem:   24158  1047  23111   0   16  356 
-/+ buffers/cache:  673  23485 
Swap:   2204   0  2204 

これらのJVMオプションを持つプロセスの開始:それが動作Xmxのように私は19Gを指定した場合、しかし、

java version "1.7.0_02" 
Java(TM) SE Runtime Environment (build 1.7.0_02-b13) 
Java HotSpot(TM) 64-Bit Server VM (build 22.0-b10, mixed mode) 

-XX:+UseConcMarkSweepGC -server -d64 -Xms4g -Xmx22g 

バージョンを。

答えて

1

Java VMは、ヒープ用とPermGen用にメモリを割り当てます。ヒープスペース+ PermGenスペースの設定が空きメモリを超えている可能性がありますか?

-XX:MaxPermSizeにはどの値が設定されていますか?

Javaのドキュメントから抽出
+0

だから、-XX: MaxPermSizeはXmxに含まれていませんか? – user3111525

+0

いいえ、それはあなたの総メモリ消費量に対して別々にカウントされます! '-Xms'と' -Xmx'はヒープのサイズのみを制御します。詳細については、[このディスカッション](http://stackoverflow.com/questions/4223809/is-java-permgen-space-part-of-the-total-vm-memory)を参照してください。 – r3nj1

+1

@frankmoss - さらにヒープにはないものがあります。スレッドスタック、JVMイメージのメモリ、メモリマップファイルとダイレクトバッファのメモリ、 'malloc'呼び出しを行うネイティブコードによって割り当てられたメモリなどがあります。 –

0

は一般的に、任意のプラットフォームのために使用可能な物理メモリの75%を超える最大ヒープサイズの設定を使用したくないあなたには、いくつかを残しておく必要がありますので、これはです。 JVMの内部使用に使用可能なメモリ領域 "となります。

は、それはまた、ラムの22ギガバイト年代に取る必要がある場合は、そのプロセスがないものは何でも見直すべきであるように聞こえる

0

おおよその計算やっているのではい、メモリレイアウトの問題に直面している:として(プロセスの サイズをUNIXマシンで見られる)=スタック

スタックのパーマ世代+サイズのヒープ+サイズのプロセスヌード+サイズの大きさは、プロセスの()MbのX サイズ(Y MB) サイズ非常に小さいですヒープの数=あなたが望むもの perm genは、さまざまなパラメータに依存しますが、パッケージングの問題(特にSpringアプリケーション)

多くの生産であなたを助けにはなりませんスワッピングを避けるために、(すべての未使用のサービスを停止する)あなたのUnixマシンに十分なメモリを残すことを忘れないでください

HTH ジェローム

関連する問題