JNI を使用してカスタム ネイティブ ライブラリを呼び出す Java アプリケーションを作成しました。ライブラリは、小さなデータ配列に渡すと問題なく動作します。ただし、データ配列が大きいと、致命的なエラー (EXCEPTION_STACK_OVERFLOW) が発生します。アプリケーションのコア ダンプは、問題のある関数 _chkstk を示しています。どうやら、_chkstk は、関数内にローカル変数のページが複数ある場合に、コンパイラによって呼び出されます。
--------------- T H R E A D ---------------
Current thread (0x3590b800): JavaThread "pool-2-thread-8" [_thread_in_native, id=11228, stack(0x0f7d0000,0x0f9d0000)]
siginfo: ExceptionCode=0xc00000fd, ExceptionInformation=0x00000000 0x0f7d0000
...
Stack: [0x0f7d0000,0x0f9d0000], sp=0x0f9b7118, free space=1948k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [b.dll+0xbfc7] _chkstk+0x27
C [b.dll+0xbf00] more_calcs+0x60
C [b.dll+0xbe1c] b+0x3c
C [a.dll+0x14b0] more_calcs+0xc0
C [a.dll+0x109c] calcs+0x3c
C [x.dll+0x1b75] Java_com_...s+0x8f5
j com.s...(Ljava/lang/String;IIIII[D[D[D[[[I[[[[D[[[[[[D)[[[[D+0
クイック検索で、何が起こっているかを詳細に説明している Oracle の Web サイトにたどり着きました4.1.3 スタック オーバーフローによるクラッシュと、問題を修正する方法を提案します-Xss パラメータを使用して、デフォルトのスレッド スタック サイズを増やします。
明確でないのは、これらの値をどれだけ増やすべきかということです。散弾銃のアプローチではなく、これを数学的に決定したいと思います。これは、ダンプ内のスタック ポインターから判断できますか?