私の Java Web アプリケーションには、Activiti ワークフロー エンジンと groovy スクリプト タスクを使用して非常に複雑なワークフローを実行するため、多くのスタック領域を必要とするバックグラウンド ワーカー スレッドが 1 つあります。
現在、StackOverflowErrors を回避するために、64 ビット Java および Tomcat で JVM Xss 設定を 16MB に設定する必要があります。エラーが発生した場合、スタック トレースは非常に巨大 (数百行) になりますが、すべてエンジン内で発生するため、私にはどうすることもできません。
今私の質問は: 実行時に単一のスレッドのスタック サイズを増やす方法はありますか?
アプリケーション内のすべてのスレッドの JVM のデフォルト Xss 設定を 512k に下げたいと思います。これで十分であり、16M でのみワーカーを実行します。
Java API は、Thread クラスのコンストラクターについて、このトピックに関するいくつかの情報を提供します。
public Thread(ThreadGroup group,
Runnable target,
String name,
long stackSize)
しかし、動作は保証されておらず ([1])、Windows で動作するかどうかについての情報は見つかりませんでした。
また、1 つのスレッドのスタック スペースを増やすことができず、デフォルト値として 16MB を指定する必要がある場合、そのように高い設定を行うとどうなりますか? これは、すべての新しいスレッドが初期化時に 16MB のメモリを予約することを意味するのでしょうか (つまり、200 スレッド * 16MB: 3,2 GB)?
jconsole と taskmgr を見る限り、メモリ フットプリントは Xss 設定を増やしてからあまり変わっていないように見えますが、何かが足りないのかもしれません。
ヘルプや説明をいただければ幸いです。
[1]: http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#Thread(java.lang.ThreadGroup , java.lang.Runnable, java.lang.String,長いです)