Java Unsafe.copyMemory java.lang.IllegalArgumentException 异常

标签 java memory-management unsafe

我对 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/

相关文章:

c - 如何实现动态共享内存大小调整?

memory-management - D 动态阵列 - RAII

java不安全,如何将内存解释为其他类型的对象?

memory - 为什么在使用不安全的 Rust 访问超出范围的变量时没有段错误?

c# - native C 字符串列表对 C# 的弱引用

java - 如何只用部分词来表达整个词?

java - Android - 在 JSON 中存储有关用户登录的信息

objective-c - 关于释放属于另一个对象的对象 - xcode 内存管理

java - 将 Web 项目作为 jar 添加到 Eclipse 部署程序集中

java - 多线程与多个应用程序