堆栈溢出导致Java JNI应用程序崩溃

时间:2013-10-14 00:58:08

标签: java c java-native-interface

我编写了一个使用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的网站,该网站详细描述了发生了什么4.1.3 Crash due to Stack Overflow,并提出了纠正问题的方法1)增加StackShadowPages的值(验证堆栈上剩余的最小空间)2)使用-Xssparameter增加默认线程堆栈大小。

尚不清楚这些值应该增加多少。相反,我想用数学方法确定霰弹枪的方法。这可以从转储中的堆栈指针确定吗?

2 个答案:

答案 0 :(得分:0)

你无法确定它崩溃的程度,程序可能已经运行了多长时间,或者如果你允许它可能会有多深。

它看起来不是很深,所以看起来你试图在堆栈上分配一个大数组而不是使用堆。由于堆栈大小有限,我会使用本机堆进行如此大的分配。

当然,这更像是一个C编程问题,而不是Java编程问题。

答案 1 :(得分:0)

IBM特定 请注意,您可以使用

查看现有堆栈大小
java -verbose:sizes

运行Java应用程序时,可以使用

更改操作系统线程的初始堆栈大小
java -Xmso512k <...other args to run your app..>

请参阅IBM Java -Xmso doc