0

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 パラメータを使用して、デフォルトのスレッド スタック サイズを増やします。

明確でないのは、これらの値をどれだけ増やすべきかということです。散弾銃のアプローチではなく、これを数学的に決定したいと思います。これは、ダンプ内のスタック ポインターから判断できますか?

4

2 に答える 2

0

IBM 固有の 注: 既存のスタック サイズは、

java -verbose:sizes

Java アプリケーションの実行時に、オペレーティング システム スレッドの初期スタック サイズを次のように変更できます。

java -Xmso512k <...other args to run your app..>

IBM Java -Xmso docを参照してください。

于 2014-12-01T04:12:55.460 に答える
0

クラッシュした方法から、プログラムが実行された可能性がある時間や、放っておくとどれくらい深くなるかを判断することはできません。

それほど深くは見えないため、ヒープを使用する代わりにスタックに大きな配列を割り当てようとしているように見えます。スタック サイズは限られているため、このような大規模な割り当てにはネイティブ ヒープを使用します。

もちろん、これは Java プログラミングよりも C プログラミングの問題です。

于 2013-10-14T01:24:15.500 に答える