为什么分段错误在 Java 中是致命的



在Java中,如果本机代码尝试访问受保护的内存,操作系统将发送一个信号,通知JVM发生了段错误。我的问题是,为什么 JVM 决定将其解释为致命和崩溃,而不是抛出某种可抛出的(异常或错误(。此功能使调试或安全关闭变得更加困难。

通常,当 C 程序出现段错误时,它会立即终止。当段错误发生在本机代码中时,JVM 也会发生同样的情况。继续是不安全的,因为本机代码可能会使应用程序处于不一致的状态,并且 JVM 不知道如何恢复。

例如,本机函数可能已经获取了一些本机资源或锁,这些资源或锁在崩溃后无法自动释放。JVM也不知道如何展开本机堆栈 - 它只能控制Java堆栈。这对于堆栈展开意味着在堆栈分配的对象上调用析构函数的代码C++尤其重要。

但是,可以为本机代码创建自己的信号处理程序。例如,如果您自己处理分段错误,则可以从故障中实现手动恢复,并将段错误转换为 Java 异常。不过,这可能很棘手。有关详细信息,请参阅集成信号和异常处理。

相关内容

  • 没有找到相关文章

最新更新