哪些VM或GC支持JNI固定?

Ale*_*sky 6 java java-native-interface

Get<PrimitiveType>ArrayElements系列函数被记录为复制数组,或将它们固定到位(并且这样做,防止压缩垃圾收集器移动它们).它被记录为一种更安全,限制性更小的替代方案GetPrimitiveArrayCritical.但是,我想知道哪些虚拟机和/或垃圾收集器(如果有的话)实际固定数组而不是复制它们.

Tre*_*ald 8

较旧的IBM JVM固定(1.4及之前 - 即:不是当前的IBM J9 JVM)但从那时起,他们没有.一般来说,JVM不喜欢固定,因为它真的会混淆复制垃圾收集器,这是大多数生产JVM今天所做的事情.我不是100%最新的(即:最新的Java 7版本),但历史上HotSpot也没有(因为相同的代际GC原因).

请注意:今天可能没有明天的JVM,反之亦然,所以你需要编写代码来处理它,就像基础Java库一样.


Ale*_*sky 3

从 Java 22 开始,G1 支持固定:https://openjdk.org/jeps/423

Shenandoah 从 Java 15 开始支持固定:https://shipilev.net/jvm-anatomy-park/9-jni-ritic-gclocker/

在这两种情况下,都不清楚固定是在使用时发生Get*ArrayElements还是仅在使用时发生Get*Critical

GC 都固定内存区域而不是单个对象,因此如果固定了很多区域,则效果可能与未进行固定时的效果相同。