Java 、Idea、Android Studio 用户请暂缓升级到 macOS 14.4

2024-03-17 09:03:08 +08:00
 codehz
https://blogs.oracle.com/java/post/java-on-macos-14-4
省流:果子改了受保护页面的默认处理方式,之前是发 sigsegv 现在直接 sigkill ,而 java 从很早的版本(已知 8 )开始就在滥用这个特性来将 null 检测改为捕获 sigsegv 信号,包括用户主动写的 if == null 也会在 jit 的帮助下被转换,这在新版本 mac 里会直接触发错误。
建议有 java 需求或依赖基于 java 的 ide 的 mac 用户暂缓升级
17354 次点击
所在节点    Apple
109 条回复
leonshaw
2024-03-17 19:22:59 +08:00
这么说哪天 CPU 也可以不给 page fault 了,直接 halt 麻烦你内核重新适配一下。
Solael
2024-03-17 19:39:09 +08:00
呵呵苹果一贯操作,你不像 windows 一样先前兼容也就罢了,测试恐怕也是阿三随便点几下就完事了,连编译程序都不测试是吧。
noahlias
2024-03-17 20:06:31 +08:00
还好没更新 14.4
DigitalG
2024-03-17 20:23:33 +08:00
看了一下,这个是不影响用户使用 java 程序是吧?只影响做 java 开发的用户,或者开发时用了基于 java 的 IDE 程序?
codehz
2024-03-17 20:25:08 +08:00
@DigitalG 只是不影响用 graalvm 这样直接 aot 的,其他 java 程序全都受到影响
OneMan
2024-03-17 21:13:53 +08:00
还好不升级
Rorysky
2024-03-17 21:23:24 +08:00
@meloyang05 #4 都是访问被保护区域了,java jit 还要依赖这个内核行为,这不是奇技淫巧的优化是什么?
p2007
2024-03-17 21:24:31 +08:00
难怪这几天 IDEA 莫名其妙崩了。
Rorysky
2024-03-17 21:28:35 +08:00
@meloyang05 #4

苹果开发这个开发文档明确说了,访问受保护区域属于预期外的行为,这能怪谁?
"A crash due to a memory access issue occurs when an app uses memory in **an unexpected way**"

https://developer.apple.com/documentation/xcode/investigating-memory-access-crashes
iseki
2024-03-17 21:47:21 +08:00
@Rorysky 一大票设施利用这个段错误和总线错误信号来做兜底呢,这要是可以随便改大家程序都不要写了。好在这次水果只是改了一个特例而已。
预期外的行为,它也是良定义的,看看你引用的这句话的下一句。
iseki
2024-03-17 21:48:20 +08:00
注意下 unexpected 不等于 undefined 也不等于 unspecified
felixlong
2024-03-17 21:50:10 +08:00
@Rorysky 这也洗,你没看 Oracle 的人说吗,Mac 14.4 最后一个 RC 版本行为都没改,最后正式版本突然改了。这让人家怎么来的及修?
Rorysky
2024-03-17 22:36:53 +08:00
@iseki #50 不要随便迁移概念, 你说的良定义猜测就是 well-defined 吧,这是描述语言标准本身的可移植性(或者说语意不依赖于运行环境,只要支持语言标准就能保证一致性输出),这和系统内核行为有什么关系,旧版本的信号量是来提示程序 bad access 的,它不是一个特性,java 不应该利用来实现功能。

普通的程序运行中 bad access ,系统认为进程有问题了,直接杀掉是激进了,但估计是为了安全的原因。

就像人犯罪了,监管机构是口头教育,还是 逮捕教育,还是就地正法,那是监管机构决定的,你不能说我利用这个机会去接受某些信息/更快的见到某些人
Rorysky
2024-03-17 22:38:11 +08:00
@felixlong #52 本来就是错误的设计,啥时候都是错误的(我并不知道 jit 怎么利用这个非法行为去加速执行
iseki
2024-03-17 22:41:34 +08:00
@Rorysky 信号量怎么就不是一个特性了?这都是写在文档上的,就因为它预期中不常见,所以就不是个特性从而可以随便更改了?既然承诺了它所产生的效果和副作用,怎么就不能用于优化了?实际上因为这个动作的延迟相对较高,JVM 的 JIT 也是用来做非预期分支去优化判定的。
一个东西既然承诺了效果,那就不该去干涉使用者怎么用,除非你有合理的理由,提前注明。
iseki
2024-03-17 22:43:46 +08:00
@Rorysky
> Null checks are cheap. They usually fold straight into a related memory access instruction, and use the CPU bus logic to catch nulls. (Deoptimization follows, with regenerated code containing an explicit check.)
iseki
2024-03-17 22:45:27 +08:00
@Rorysky 如果利用捕获 sigsegv 去做某些事是错误的,那设计这个信号量又是为了什么?如果你说有些事可以做有些事不能做,那就得讲明白哪些事不能做,有什么合理的理由。
BeiChuanAlex
2024-03-17 23:17:13 +08:00
吓死我了,还我写 rust
cubecube
2024-03-17 23:25:22 +08:00
only apple can do
felixlong
2024-03-17 23:39:11 +08:00
@Rorysky 呵呵,我打赌 Apple 会把这个改回去。你信不信?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1024389

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX