在一个晴朗的日子里,你坐在 Mac 前,专注地编写 Java 代码。突然,你的 IDE 崩溃了,Java 进程意外终止。你感到困惑,不知道发生了什么。这并不是你一个人的问题,因为自从 macOS 14.4 更新发布以来,Java 用户普遍遇到了类似的困扰。
问题的根源
macOS 14.4 引入了一个新特性,它控制了动态生成代码在每个线程上的执行方式。在正常的即时编译和执行周期中,macOS 上运行的进程可能会访问受保护的内存区域。在 macOS 14.4 之前,当进程尝试访问这些受保护的内存区域时,macOS 内核会发送一个信号(SIGBUS 或 SIGSEGV)给进程。进程可以选择处理该信号并继续执行。
然而,macOS 14.4 中的新特性改变了这一行为。现在,当线程处于写模式时,如果尝试访问受保护的内存区域,macOS 将发送信号 SIGKILL。这个信号无法由进程处理,进程会被无条件地终止。
Java 受影响
Java 虚拟机(JVM)动态生成代码,并利用受保护的内存访问信号机制来确保正确性和性能。然而,macOS 14.4 中的更改导致了问题:原本可以处理信号的 Java 进程现在会直接终止。这对于依赖 Java 的 IDE 和其他基于 Java 的应用程序来说是个大问题。
解决方案
如果你是 Java 用户,特别是在 ARM 架构的 Apple 设备上运行 macOS 14 的用户,请暂缓升级到 macOS 14.4。目前还没有有效的解决方法,而且回滚 macOS 更新并不容易。如果你已经升级了,建议备份系统并等待问题解决。
总结
这次 macOS 14.4 更新的内核改动引发了 Java 开发者的担忧。我们希望苹果能够尽快解决这个问题,以确保开发者和用户的体验不受影响。