我正在尝试集成Java和C函数,但遇到了一些麻烦。我试图以此方式初始化变量char DataString [32] [900];而且我不断收到“发生了不可恢复的堆栈溢出”。如果我将其删除,则程序不会再崩溃。您有什么想法是由什么引起的?
听起来,您(实际上)在Java线程的堆栈上分配了一个大数组(同时调用C方法),这导致堆栈超载。这将是“不可恢复的”,因为超出堆栈末尾的写入可能会破坏内存1中接下来出现的所有内容。面对潜在的内存损坏,JVM别无选择,只能纾困。
如果此诊断正确,那么解决方案是不在C代码中在堆栈上分配大数据结构!而是使用malloc
分配它们...并且不要忘记free
它们,否则您将发现本机代码内存泄漏。
或者,您可以尝试使用更大的Java线程堆栈:
-Xss<size>
选项更改默认的堆栈大小。这可能会影响所有线程。Thread
构造函数的某些重载具有用于覆盖默认堆栈大小的参数。1-相反,如果纯Java方法导致堆栈溢出,则在代码有机会践踏其他堆栈或数据结构之前,将始终检测到[[always。因此,对于JVM来说,抛出StackOverflowError
并为应用程序提供机会尝试恢复是安全的。