2017-12-12 18 views
1

2Gスタックサイズのlinuxでプログラムを起動しようとすると、JVMはメモリ不足のエラーで直ちに終了するという問題があります。 -Xss2Gを使用した場合のJVM OutOfMemoryError

この

は、メモリ不足の例外のうちに終了し、これらのフラグはすぐにJVMを引き起こす

-Xmx8G -Xss2047m 

問題なく動作します

-Xmx8G -Xss2048m 

ボックスはとても実行している他のメモリの32ギガバイトとほとんど何もしています私は利用可能なメモリが実際に使い果たされていないと確信しています。私はある種のシステム制限があると仮定していますが、私はそれが実際に何であるかを調べるのに苦労しています。

私はRHEL 7.4を実行しているとOpenJDKの1.8.0_151「のulimit -a」の

出力使用しています:私はそれをフルに実行するために取得するために微調整する必要があるかについて

core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 127929 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 1024 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 8192 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

任意のアイデアを2GB以上?

+0

あなたはどのように多くのスレッドを持っていますか? –

+0

これは単なるスレッド化されたネイティブプロセスを起動する単なるラッパーです。かなり少数のスレッド。 – brainchrist

+3

-Xssは** per thread **です.JVM自体によって開始されたバックグラウンドスレッドにも適用されます。とにかにネイティブプロセスをラッピングするのであれば、なぜ2Gスタックが必要でしょうか? – jingx

答えて

3

これはJVMのバグです。 ThreadStackSizeは1Kの倍数に丸められたときに、値がintに変換され、arguments.cpp参照:

// Internally track ThreadStackSize in units of 1024 bytes. 
    FLAG_SET_CMDLINE(intx, ThreadStackSize, 
          round_to((int)long_ThreadStackSize, K)/K); 

したがって、2Gは、負にオーバーフローし、そしてpthread_createの後の呼び出しは失敗します。

バグJDK-8178491は、それがこのような大規模なスタックが今までに必要とされたときに実際のケースを想像するのは難しいJDK 10

に固定されています。あなたが真剣2GBのスタックよりも多くしてスレッドを作成したい場合は、引数としてstackSizeを受け入れThread constructorを使用することがあります。

public Thread(ThreadGroup group, 
        Runnable target, 
        String name, 
        long stackSize) 
+0

私は、特定のJavaコードに必要なスタックの量が完全に特定されておらず、予測できないという事実に対処するのはOPの方法だと思うので、あるサイズが時には不十分であることがわかると、かなり多くのメモリをそれに投げることです。 Java VMで固定サイズのスタックを手動で設定したことは時代遅れです。特に、無意味なバイト数で指定されています... – Holger

関連する問題