我编写了一个使用 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 由于堆栈溢出而导致的崩溃,并提出了解决问题的方法 1) 增加 StackShadowPages 的值(验证堆栈上剩余的最小空间量)2)使用 -Xss 参数增加默认线程堆栈大小。
不清楚的是这些值应该增加多少。而不是霰弹枪方法,我想用数学方法确定这一点。这可以从转储中的堆栈指针确定吗?