当前位置: 首页 > 知识库问答 >
问题:

Java JNI应用程序由于堆栈溢出而崩溃

隆兴修
2023-03-14

我编写了一个Java应用程序,它使用JNI调用自定义的本机库。这个库工作得很好,我们可以通过它来处理小数据数组。但是,较大的数据数组会导致致命错误(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)使用-XSSParameter增加默认的线程堆栈大小。

不清楚的是这些数值应该增加多少。而不是鸟枪的方法,我想用数学的方法来确定这一点。这能从转储中的堆栈指针确定吗?

共有1个答案

商迪
2023-03-14

你不能从它崩溃的方式来确定程序可能运行了多长时间,或者如果你让它运行,它可能运行了多深。

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

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

 类似资料:
  • 我有一个执行快速排序的应用程序。在我开始给它一些更大的数字(我第一次得到它是10000000)之前,它工作得很好。我知道是由递归引起的,但我不明白为什么我的应用程序会因此而崩溃。如有任何建议,将不胜感激。这是我的密码:

  • 当我尝试更新应用程序时,应用程序崩溃了。在我们的应用程序中,我们正在缓存中保存更新的版本,然后尝试从缓存中安装应用程序。应用程序由于android.os.fileuriexposedexception而崩溃。我发现通过intent.getData()在应用程序之外公开了日志android.os.fileuriexposedexception:file:///storage/emulated/0/t

  • 前言我改了标题。很难理解为什么在调试时,有时未被捕获的异常会向Logcat输出“致命异常”,而有时不会。 下面的简化示例在我到达 line 时崩溃了。Logcat 内部没有堆栈跟踪或其他指示,说明出了什么问题。我运行的是 Android Studio 3.0.0beta4。 为什么它会崩溃?(更新-崩溃是由于安全例外) 为什么Logcat不显示堆栈跟踪或其他错误 更新好了,我知道它为什么崩溃了。我

  • 问题内容: 下面给出的代码显示了运行时的Stackoverflow错误。但是,如果我使另一个类CarChange创建Car的对象,它将成功运行。我是一个初学者,请执行以下代码以了解在Java中进行向上转换的重要性。 问题答案: 一个stackoverflow通常意味着您有一个无限循环。 收到此消息的原因是因为您从testdrive方法调用驱动器,并且在该方法中再次调用drive。

  • 问题内容: 这有效:http : //play.golang.org/p/-Kv3xAguDR。 这导致堆栈溢出:http : //play.golang.org/p/1-AsHFj51O。 我不明白为什么。在这种情况下,使用接口的正确方法是什么? 问题答案: 这个 将呼叫您的,依次呼叫,等等。如果您需要解组JSON然后对其进行处理,那么一种巧妙的技术是声明一个本地类型,将数据解组到其中,然后转换

  • 我写了以下内容: 解决4clojure.com的问题#118:http://www.4clojure.com/problem/118 当我询问时,不出所料,我会得到一个clojure.lang.lazyseq,但我不知道这与简单地删除lazy-seq“包装”有什么区别。 当然,现在如果删除lazy-seq,我会得到一个stackoverflow,为什么要执行这个: 否则(也就是说:如果我让lazy