2012-02-05 21 views
9

this oneのような質問がありました。私は答えに満足していないので、私はここでより詳細なメッセージを入れてみましょう。ubuntuでjvmプロセスメモリを制限する

JVM OPTでアプリケーションを起動しようとしています:-Xmx128m -Xms32m -XX:MaxPermSize=64m。アプリケーションが起動したときに、cat /proc/10413/statusと入力してメモリ使用量を確認すると、vmsizeが600512 kB以上であることがわかりました。それは私の設定よりもはるかに大きいです。私はプロセスのjvmメモリ使用量を制限する方法を知りたいです。

Name: java 
State: S (sleeping) 
Tgid: 10413 
Pid: 10413 
PPid: 1 
TracerPid:  0 
Uid: 1001 1001 1001 1001 
Gid: 1007 1007 1007 1007 
FDSize: 128 
Groups: 1001 1007 
**VmPeak: 728472 kB** 
**VmSize: 600512 kB** 
VmLck:   0 kB 
VmHWM: 298300 kB 
VmRSS: 280912 kB 
VmData: 647804 kB 
VmStk:  140 kB 
VmExe:  36 kB 
VmLib:  13404 kB 
VmPTE:  808 kB 
VmSwap:  0 kB 
Threads:  33 
SigQ: 0/31522 
SigPnd: 0000000000000000 
ShdPnd: 0000000000000000 
SigBlk: 0000000000000000 
SigIgn: 0000000000000000 
SigCgt: 2000000181005ccf 
CapInh: 0000000000000000 
CapPrm: 0000000000000000 
CapEff: 0000000000000000 
CapBnd: ffffffffffffffff 
Cpus_allowed: f 
Cpus_allowed_list:  0-3 
Mems_allowed: 00000000,00000001 
Mems_allowed_list:  0 
voluntary_ctxt_switches:  3 
nonvoluntary_ctxt_switches:  2 

答えて

9

あなたは-XmxのみJavaヒープを制御し、あなたがを制御したいものを制御することはできません、それは実装に基づいて完全に異なって消費されてJVMによってネイティブメモリの消費量を制御しません。次の記事Thanks for the Memory (Understanding How the JVM uses Native Memory on Windows and Linux)

あなたがコントロールすることはできませんネイティブのメモリを使用して、ヒープとガベージコレクタを維持するから、

Javaヒープを維持するメモリ管理システム の状態を維持するために、より多くのネイティブメモリが必要です。 がゴミを収集すると、データ構造 を割り当てて、空きストレージを追跡し、進行状況を記録する必要があります。これらのデータ構造の正確なサイズと性質は実装によって異なりますが、多くは ヒープのサイズに比例します。

とJITコンパイラはjavac

バイトコードのコンパイルが(gccなどの静的 コンパイラを実行するためのメモリを必要とするのと同じように)ネイティブのメモリを使用していますが、両方とも同じようにネイティブのメモリを使用していますJITの入力( バイトコード)と出力(実行可能コード)も をネイティブメモリに格納する必要があります。多くの JITコンパイルされたメソッドを含むJavaアプリケーションは、より小さいアプリケーションよりもネイティブメモリを使用します。

、その後、あなたはネイティブのメモリを使用するクラスローダ(複数可)を持っている

Javaアプリケーションは、オブジェクト構造 とメソッドのロジックを定義するクラスで構成されています。また、Javaランタイムクラス ライブラリ(java.lang.Stringなど)のクラスを使用し、サードパーティの ライブラリを使用することもできます。これらのクラスは、それらが使用されている間、 の間、メモリに格納する必要があります。クラスの格納方法は、実装によって異なります。

私も、私はあなたが -Xmxあなたはそれが制御する考えを制御していないというアイデアを得ると思う、それはJVMのヒープを制御スレッド上のセクションを引用開始されません、ではない、すべて はJVMに行きますヒープとヒープは、 の管理とブックを保存するために指定するものより多くのネイティブメモリを使用します。Linux上の他のプロセスと同様に

1

、あなたはJVMプロセスのメモリ使用量を(4ギガバイトに言う)を制限することができます

$ ulimit -v 4194304 
$ java ... # execute your Java program 

(技術的にはこれは実際に実際の上限である仮想メモリであり、メモリ使用量But ulimit apparently doesn't work with actual RAM usage.

これにより、制限を超えるメモリ割り当てが失敗し、おそらくOutOfMemoryErrorとなり、アプリケーションが終了します。

関連する問題