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的实例之后,我们就可以实现如下功能
- 内存管理:内存的分配、释放、拷贝等,利用copyMemory方法可以实现一个通用的对象浅拷贝方法。
- 非常规对象的实例化:使用allocateInstance方法能直接生成实例对象,无需调用构造方法和它的初始化方法,在对象反序列化时会很有用,能重建和设置final字段而不要调用构造方法。
- 操作类、对象、变量:获取对象指针,修改指针指向的数据。
- 数组操作:使用Unsafe类的内存分配方法可以实现超大数组,但注意要自己释放内存。
- 多线程同步:CAS操作、锁机制,LockSupport的pack、unpark方法最终都是调用了Unsafe的pack、unpack方法。
- 内存屏障:在Java8中新引入的,用于定义内存屏障,避免代码重排。
3、Java9中Unsafe的变化
- Unsafe包路径发生变化,被移动到jdk.internal.misc包下。
- 增加了非常详细的注释,增加一个静态方法,可以直接拿到theUnsafe对象。
https://blog.csdn.net/luzheqi/article/details/79097682
Java操作系统硬件的方法Unsafe的更多相关文章
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口(老罗学习笔记4)
在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口.实现这两者的目的是为了向更上一层提供硬件访问接口,即为 ...
- 为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接 口.实现这两者的目的是为了向更上一层提供硬件访问接口,即 ...
- JAVA中神奇的双刃剑--Unsafe
前提 参考资料: Java魔法类:sun.misc.Unsafe 在openjdk8下看Unsafe源码 Unsafe介绍 在Oracle的Jdk8无法获取到sun.misc包的源码,想看此包的源码可 ...
- java中的native方法和修饰符(转)
Java中的native修饰符 今天偶然看代码,发现别人有这样写的方法,并且jar里面有几个dll文件,比较奇怪,于是把代码打开,发现如下写法. public native String GSMMod ...
- Java中的native方法
博客引用地址:Java中的native方法 今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解. 一. 什么是Native Method 简单地 ...
- java 里面的 native 方法
第一篇: 今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解. 一. 什么是Native Method 简单地讲,一个Native Meth ...
- atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug
atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug 1. core.setProperty(o, "materialId&qu ...
- JAVA常见错误处理方法 和 JVM内存结构
OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...
- 转:JAVA常见错误处理方法 和 JVM内存结构
OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...
随机推荐
- Free Pascal 的安装
Free Pascal 的安装 https://www.cnblogs.com/cnssc/p/6110492.html https://wenku.baidu.com/view/ee80cc8eed ...
- NGUI版虚拟摇杆
以下是我用nui实现的一个虚拟摇杆. 1,示图 2.代码例如以下,都有比較具体的凝视.就不说明了. using UnityEngine; using System.Collections; using ...
- 百科知识 scm文件如何打开
用scplayer打开,目前有效的下载链接将是: http://download.csdn.net/download/kevingao/2686778
- C++11 并发指南五(std::condition_variable 详解)(转)
前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread,std::mut ...
- STL中各容器之函数总结
一.序列和关联非共同拥有函数 全部标准库共同拥有函数 (构造,相关属性,迭代器,插入与删除,比較.swap) 当中operator>,operator>=,operator<,op ...
- python(27)- 面向对象练习Ⅰ
一:定义如下类,并最大程度地重用代码(继承,派生:子类重用父类方法,组合) 老师类 学生类 分数类 课程类 生日类 class People: def __init__(self,name,age,b ...
- JavaScript 内存机制
简介 每种编程语言都有它的内存管理机制,比如简单的C有低级的内存管理基元,像malloc(),free().同样我们在学习JavaScript的时候,很有必要了解JavaScript的内存管理机制. ...
- [Maven实战](9)传递性依赖
了解Spring的朋友都知道.创建一个Spring Framework项目都须要依赖什么样的Jar包.假设不使用Maven,那么在项目中就须要手动下载相关的依赖.因为Spring Framework又 ...
- MySQL提示Access denied for user ''@'localhost'”的解决
记得那时由于没有网络,把rootpassword改错了写成了: update user set password="122" where user="root" ...
- 看完此文,妈妈还会担心你docker入不了门?
本文在个人技术博客不同步发布,详情可猛戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 上周对象突然心血来潮说想养个小宠物,我问想养啥她又说随便,你看着办!!!这我 ...