Get<PrimitiveType>ArrayElements
函数系列被记录为复制数组或将它们固定到位(这样做可以防止压缩垃圾收集器移动它们)。它被记录为 GetPrimitiveArrayCritical
的更安全、限制更少的替代方案。但是,我想知道哪些虚拟机和/或垃圾收集器(如果有)实际上固定数组而不是复制它们。
较旧的 IBM JVM 已被固定(1.4 及之前的版本 - 即:不是当前的 IBM J9 JVM),但从那时起,它们就不再固定了。一般来说,JVM 不喜欢固定,因为它确实会扰乱复制垃圾收集器,而这正是当今大多数生产 JVM 所做的事情。我不是 100% 最新的(即:最新的 Java 7 版本),但历史上 HotSpot 也不是(出于同一代 GC 的原因)。
请注意:今天固定的 JVM 明天可能不会,反之亦然,因此您需要编写代码来处理这两种方式,就像基本 Java 库一样。
G1 从 Java 22 开始支持固定:https://openjdk.org/jeps/423
Shenandoah 从 Java 15 开始支持固定:https://shipilev.net/jvm-anatomy-park/9-jni-ritic-gclocker/
在这两种情况下,都不清楚是在使用
Get*ArrayElements
时发生固定还是仅在 Get*Critical
时发生。
两个 GC 都固定内存区域而不是单个对象,因此如果固定了很多区域,则效果可能与未进行固定相同。