通常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

Java操作系统硬件的方法Unsafe的更多相关文章

  1. 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口(老罗学习笔记4)

    在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口.实现这两者的目的是为了向更上一层提供硬件访问接口,即为 ...

  2. 为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口

    在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接 口.实现这两者的目的是为了向更上一层提供硬件访问接口,即 ...

  3. JAVA中神奇的双刃剑--Unsafe

    前提 参考资料: Java魔法类:sun.misc.Unsafe 在openjdk8下看Unsafe源码 Unsafe介绍 在Oracle的Jdk8无法获取到sun.misc包的源码,想看此包的源码可 ...

  4. java中的native方法和修饰符(转)

    Java中的native修饰符 今天偶然看代码,发现别人有这样写的方法,并且jar里面有几个dll文件,比较奇怪,于是把代码打开,发现如下写法. public native String GSMMod ...

  5. Java中的native方法

    博客引用地址:Java中的native方法 今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解. 一. 什么是Native Method 简单地 ...

  6. java 里面的 native 方法

    第一篇: 今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解. 一. 什么是Native Method   简单地讲,一个Native Meth ...

  7. atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug

    atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug 1. core.setProperty(o, "materialId&qu ...

  8. JAVA常见错误处理方法 和 JVM内存结构

    OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...

  9. 转:JAVA常见错误处理方法 和 JVM内存结构

    OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...

随机推荐

  1. vu 是什么

    unsigned char 是无符号字符型 volatile      易变,易失的 volatile  unsigned char i; 意思是定义一个无符号字符型的变量 i. 这个变量存放在内存中 ...

  2. ListView中button监听器 设置 及 优化

    在应用开发中常常会用到ListView,而且每个Item里面都会有button之类的须要进行事件监听的控件.在给button加入OnClickListener的时候,一開始非常下意识的会想在ListV ...

  3. 【每日Scrum】第六天(4.27) TD学生助手Sprint2站立会议

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 今天和楠哥做了课程事件和日历表操作的例子,并尝试做时间表和日历表的数据库设计 Y 刘静 今天开始编辑自己项目中的日历管理 编辑程序,能够在日历 ...

  4. ASP.NET MVC模式——WebPages

    WebPages 示例 123456<html> <body> <h1>Hello Web Pages</h1> <p>The time i ...

  5. WPF学习专题

    http://developer.51cto.com/art/200809/88207.htm

  6. sharding-jdbc源码学习(一)简介

    背景 对于大型的互联网应用来说,数据库单表的记录行数可能达到千万级甚至是亿级,并且数据库面临着极高的并发访问.采用Master-Slave复制模式的MySQL架构,只能够对数据库的读进行扩展,而对数据 ...

  7. 安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.3引发的血案

    1.下载了一个开源项目,是用netcore开发的 2.VS2015打不开解决方案 3.于是安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.3 4.安装成功,项目顺利 ...

  8. echarts 饼状图

    说明:这是我做项目时自己写的小例子,里面有冗余的参数. 开发环境 vs2012 asp.net mvc4  c# 1.显示效果 2.HTML代码 <%@ Page Language=" ...

  9. 九度OJ 1123:采药 (01背包、DP、DFS)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2705 解决:1311 题目描述: 辰辰是个很有潜能.天资聪颖的孩子,他的梦想是称为世界上最伟大的医师. 为此,他想拜附近最有威望的医师为师 ...

  10. 推荐一个非常好的 IntelliJ IDEA 教程

    教程地址:https://github.com/judasn/IntelliJ-IDEA-Tutorial 作者博客:http://www.youmeek.com/category/software- ...