• Java操作系统硬件的方法Unsafe


    通常Java代码都是运行在JVM中而不能直接访问系统硬件如进行内存分配释放等,但如果有需要跳过JVM直接用Java访问系统硬件,比如像C语言指针一样操作的话就可以调用Unsafe对象相关方法。

    1、Unsafe说明

    Unsafe类在sun.misc包下,不属于Java标准。但是很多Java基础类库,包括一些高性能的开发库都是基于Unsafe类开发的,比如Netty、Hadoop、Kafka、JUC并发包的基础AQS依赖的CAS操作和LockSupport类等。Unsafe在提升Java运行效率,增强Java底层操作能力方面起了很大的作用。但它大部分操作都是绕过JVM通过JNI完成的,因此它分配的内存需要手动free,过度的使用Unsafe类会让出错几率变大,所以是非常危险的,Java官方不建议直接使用。

    2、Unsafe类的使用

    Unsafe类是一个单例,可通过getUnsafe方法获取,但内部会检查限制,只有是系统类加载器加载的类才能调用,否则会抛出异常。可通过JVM启动参数-Xbootclasspath指定要启动的类为启动类或通过反射获取到它的实例【Unsafe类中有一个私有的成员变量theUnsafe,我们可以用反射将其实例的访问属性设置为true,然后通过File的get方法获取】。

    Field f = Unsafe.class.getDeclaredField("theUnsafe");
    f.setAccessible(true);
    Unsafe unsafe = (Unsafe) f.get(null);

    获取到Unsafe的实例之后,我们就可以实现如下功能

    1. 内存管理:内存的分配、释放、拷贝等,利用copyMemory方法可以实现一个通用的对象浅拷贝方法。
    2. 非常规对象的实例化:使用allocateInstance方法能直接生成实例对象,无需调用构造方法和它的初始化方法,在对象反序列化时会很有用,能重建和设置final字段而不要调用构造方法。
    3. 操作类、对象、变量:获取对象指针,修改指针指向的数据。
    4. 数组操作:使用Unsafe类的内存分配方法可以实现超大数组,但注意要自己释放内存。
    5. 多线程同步:CAS操作、锁机制,LockSupport的pack、unpark方法最终都是调用了Unsafe的pack、unpack方法。
    6. 内存屏障:在Java8中新引入的,用于定义内存屏障,避免代码重排。

    3、Java9中Unsafe的变化

    1. Unsafe包路径发生变化,被移动到jdk.internal.misc包下。
    2. 增加了非常详细的注释,增加一个静态方法,可以直接拿到theUnsafe对象。

    说一说Java的Unsafe类

    https://blog.csdn.net/luzheqi/article/details/79097682

  • 相关阅读:
    Javascript逻辑运算认识
    Javascript基本数据认识
    python爬虫数据提取之bs4的使用方法
    权限和频率组件的使用
    版本控制和认证组件的使用
    drf中View和router的详解
    Serializers组件详解
    REST架构简介
    模型层中QuerySet的学习
    最全总结!聊聊 Python 发送邮件的几种方式
  • 原文地址:https://www.cnblogs.com/doit8791/p/9124572.html
Copyright © 2020-2023  润新知