macOS 14 的 Java 用户不要更新 macOS 14.4

@高效码农  March 18, 2024

macOS 14.4 引入的一个问题会导致 Java 进程意外终止,该问题影响从 Java 8 到 JDK 22 的早期访问版本的所有 Java 版本。没有可用的解决方法,而且没有简单的方法来恢复 macOS 更新,受影响的用户可能无法恢复到稳定的配置,除非他们在操作系统更新之前对其系统进行了完整备份。

该问题在 macOS 14.4 的早期访问版本中并不存在,因此直到 Apple 发布更新后才被发现。

Apple 芯片处理器(M1、M2 和 M3)上的 macOS 包含一项功能,可控制如何以及何时在每个线程上生成(编写)或执行动态生成的代码。

作为即时编译和执行周期的正常部分,在 macOS 上运行的进程可能会访问受保护内存区域中的内存。在 macOS 14.4 更新之前,在某些情况下,macOS 内核会通过 向进程发送信号SIGBUS 或 SIGSEGV来响应这些受保护的内存访问。然后该进程可以选择处理该信号并继续执行。在 macOS 14.4 中,当线程在写入模式下运行时,如果尝试对受保护的内存区域进行内存访问,macOS 将发送信号 SIGKILL。该进程无法处理该信号,并且该进程将无条件终止。

Java虚拟机动态生成代码并利用受保护的内存访问信号机制来实现正确性(例如,处理内存映射文件的截断)和性能。在 macOS 14.4 中,尝试执行此操作的程序现在将终止,而不是有机会处理信号。

使用 GraalVM 本机映像创建的提前编译的应用程序不应受到影响,但您构建新映像的能力可能会受到影响。

Oracle 已将这一情况通知其客户、Apple 以及我们的 OpenJDK 合作伙伴。我们建议运行 macOS 14 的基于 ARM 的 Apple 设备上的 Java 用户推迟应用更新,直到此问题得到解决。



评论已关闭