Get<PrimitiveType>ArrayElements
函数族被记录为要么复制数组,要么将它们固定在原地(并且在这样做的同时,防止紧凑式垃圾收集器移动它们)。它被记录为是GetPrimitiveArrayCritical
的更安全、更不限制的替代方案。然而,我想知道哪些虚拟机和/或垃圾收集器(如果有)实际上会固定数组而不是复制它们。
Get<PrimitiveType>ArrayElements
函数族被记录为要么复制数组,要么将它们固定在原地(并且在这样做的同时,防止紧凑式垃圾收集器移动它们)。它被记录为是GetPrimitiveArrayCritical
的更安全、更不限制的替代方案。然而,我想知道哪些虚拟机和/或垃圾收集器(如果有)实际上会固定数组而不是复制它们。
旧版的IBM JVM(1.4及之前版本 - 即非当前的IBM J9 JVM)会进行钉住,但此后它们就没有了。总的来说,JVM不喜欢钉住内存,因为这会严重破坏复制垃圾收集器的功能,而大多数生产JVM今天都使用此功能。我并不是100%更新到最新的Java 7构建版本,但从历史上看,HotSpot也不支持(由于同样的分代GC原因)。
需要注意的是:今天进行钉住内存的JVM明天可能就不会钉住,反之亦然,因此您需要编写代码以处理两种情况,就像基本的Java库一样。
Shenandoah支持固定(尽管不清楚在使用Get*ArrayElements
时是否支持,或仅在使用Get*Critical
时支持):https://shipilev.net/jvm-anatomy-park/9-jni-critical-gclocker/