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

问题描述 投票:2回答:1

我正在尝试集成Java和C函数,但遇到了一些麻烦。我试图以此方式初始化变量char DataString [32] [900];而且我不断收到“发生了不可恢复的堆栈溢出”。如果我将其删除,则程序不会再崩溃。您有什么想法是由什么引起的?

java c java-native-interface stack-overflow
1个回答
8
投票

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

如果此诊断正确,那么解决方案是不在C代码中在堆栈上分配大数据结构!而是使用malloc分配它们...并且不要忘记free它们,否则您将发现本机代码内存泄漏。

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

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

1-相反,如果纯Java方法导致堆栈溢出,则在代码有机会践踏其他堆栈或数据结构之前,将始终检测到[[always。因此,对于JVM来说,抛出StackOverflowError并为应用程序提供机会尝试恢复是安全的。

© www.soinside.com 2019 - 2024. All rights reserved.