我对 Unsafe 的 copyMemory 有疑问。 我花了 2 天时间解决它,但没有结果。 下面给出的代码总是以“IllegalArgumentException”结尾。 你能帮我看看问题出在哪里吗?
public void testMemoryCopy() {
class A {
public long val = 10;
}
A a0 = new A();
A a1 = new A();
try {
long offset = unsafe.objectFieldOffset(A.class.getField("val"));
unsafe.copyMemory(a0, offset, a1, offset, 8);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
}
最佳答案
不幸的是,此版本的 Unsafe.copyMemory
仅适用于复制到堆外内存区域(通过提供 null
作为目标 + 绝对内存地址而不是偏移量)或当复制到一个原始数组。
当尝试将 null
或原始数组以外的任何其他内容指定为第三个参数时,您将得到一个 java.lang.IllegalArgumentException
。
或者您可以使用 Unsafe.copyMemory (long srcAddress, long destAddress, long bytes)
并直接提供地址(这当然是有风险的,因为对象可能同时移动了)。
关于Java Unsafe.copyMemory java.lang.IllegalArgumentException 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41051636/