エンタープライズ・アプリには、シビアな現実(?)が多々ありますね。今回はメモリチューニングでヤラレました。
以下、単なる私的な覚書です。
・
引用元「サイズの大きいヒープを使用する際のアプリケーション固有の留意事項(HP-UX 11.0/11i PA-RISC)」
スレッド スタックとCヒープは、Javaヒープと同じアドレス空間から割り当てられます。 このため、設定したJavaヒープが大きすぎると、新しいスレッドが正しく開始されないことがあります。 また、Cヒープで新しいページの割り当てができなかった場合、ランタイム メソッドやネイティブ メソッドの別の部分で突然エラーが発生することもあります。 アプリケーションは1.7GBのヒープがあれば正しく起動することがありますが、正しく動作するとは限りません。
例えば、1MBのスタック サイズ(-Xss1m)を使用し、プロセスに約80個のスレッドがある場合、スタック用に80MBを確保します。 ネイティブ ライブラリがある場合は、Cヒープ用に64MBをさらに追加する必要があります。 これで、スタックとCヒープに合計144MBを使用することになるため、このアドレス空間をJavaヒープに利用できません。
各プログラムによってCヒープの要件やスレッド数が異なるため、 極限の状態でアプリケーションを実行した場合にどのような影響が出るのかを調べることは困難です。 アプリケーションの実際の要件を理解することが大切です。運用環境に展開する前に、-XverbosegcオプションやGlancePlusなどのツールでモニタしながら、サイジング テストを実施することをお勧めします。
・
・・・ということで、ハンパにヒープだけを増やす(たとえば1000MB超の値にする)と、ネイティブ領域を食ってしまい、「java.lang.OutOfMemoryError: unable to create new native thread」
みたいなエラーが出てしまう、と。
・・・深い世界です。