1. 总结
unsafe可以帮我们直接去操作硬件资源,当然了是借助JVM的jit来进行的
官方不推荐使用,因为不安全,例如你使用unsafe创建一个超级大的数组,但是这个数组jvm是不管理的,只能你自己操作,容易oom,也不利于资源的回收.
随便只要你高兴,都可以获取到unsafe实例,因为涉及到unsafe的权限问题,所以,我们只能使用反射方式获取,不然就是权限异常
unsafe对对象的修改,是可以越过权限,直接操作内存数据的
2. 能做的事情
获取数组元素的基本偏移量(数组的内存地址的偏移量)、数组元素间隔偏移量 => 基本偏移量 + 间隔偏移量 * 数组元素索引 => 获取、修改数组元素
通过类的Class对象创建实例,可以避开执行其构造器
获取、修改对象属性 => 获取对象属性的偏移量 => 需要传入属性的反射对象reflect.Field
当使用框架反序列化或者构建对象时,会假设从已存在的对象中重建 或者更准确一点是能直接设置内部字段甚至是final字段的函数。问题是你想创建一个对象的实例,但你实际上又不需要构造函数,因为它可能会使问题更加困难而且会有副作用。
直接给JAVA内存区域分配(allocateMemory)、修改内存(setMemory)
给指定的内存位置设置一些基本数据类型
CAS操作,当需要改变的值为期望的值时,那么就替换它为新的值,是原子(不可在分割)的操作。很多并发框架底层都用到了CAS操作,CAS操作优势是无锁,可以减少线程切换耗费的时间,但CAS经常失败运行容易引起性能问题,也存在ABA问题。
获取JVM的一些环境配置的常量(地址大小addressSize,页大小pageSize)
线程许可 许可线程通过(park),或者让线程等待许可(unpark)
堆外内存(off-heap memory)技术,在java.nio包中部分可用 这种方式的内存分配不在堆上,且不受GC管理,所以必须小心Unsafe.freeMemory()的使用。它也不执行任何边界检查,所以任何非法访问可能会导致JVM崩溃