有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java发生了不可恢复的堆栈溢出

我正在尝试集成Java和C函数,但遇到了一些问题。 我试图以这种方式初始化变量char DataString[32][900];我不断得到“发生了无法恢复的堆栈溢出。” 如果我删除它,程序就不会再崩溃了。 你知道是什么引起的吗


共 (1) 个答案

  1. # 1 楼答案

    听上去,您(实际上)在Java线程的堆栈上分配了一个大数组(同时调用C方法),这会导致堆栈溢出。这将是“不可恢复的”,因为超出堆栈末尾的写入可能会破坏内存中接下来出现的任何内容1。面对潜在的内存损坏,JVM别无选择,只能退出

    如果这个诊断是正确的,那么解决方案就是不要在C代码的堆栈上分配大数据结构!使用malloc来分配它们。。。别忘了free它们,否则你会有一个本机代码内存泄漏需要追踪

    或者,您可以尝试使用更大的Java线程堆栈:

    • -Xss<size>选项更改默认堆栈大小。这可能会影响所有线程
    • Thread构造函数的某些重载有一个参数用于覆盖默认堆栈大小

    1-相比之下,如果纯Java方法导致堆栈溢出,则在代码有机会破坏其他堆栈或数据结构之前,总是检测到堆栈溢出。因此,JVM抛出StackOverflowError并为应用程序提供尝试恢复的机会是安全的