Unsafe

67 阅读3分钟

这是我参与「掘金日新计划 · 8 月更文挑战」的第1天

Unsafe有什么用?

Unsafe是用于在实质上扩展Java语言表达能力、便于在更高层(Java层)代码里实现原本要在更低层(C层)实现的核心库功能用的。

Unsafe有哪些功能?

内存操作 CAS 操作 Class 操作 对象操作 系统相关 内存屏障 线程调度 数据相关

内存操作

Unsafe可以分配和释放内存。

方法

  • public native long allocateMemory(long bytes);//分配新的本地空间
  • public native long reallocateMemory(long address, long bytes);//重新调整内存空间的大小
  • public native void setMemory(Object o, long offset, long bytes, byte value);//将内存设置为指定值
  • public native void copyMemory(Object srcBase, long srcOffset,Object destBase, long destOffset,long bytes);//内存拷贝
  • public native void freeMemory(long address);//清除内存

为什么要使用堆外内存?

  • 对垃圾回收停顿的改善。由于堆外内存是直接受操作系统管理而不是JVM,所以当我们使用堆外内存时,即可保持较小的堆内内存规模。从而在GC时减少回收停顿对于应用的影响。
  • 提升程序I/O操作的性能。通常在I/O通信过程中,会存在堆内内存到堆外内存的数据拷贝操作,对于需要频繁进行内存间数据拷贝且生命周期较短的暂存数据,都建议存储到堆外内存。

内存屏障

在Java 8中引入,用于定义内存屏障(也称内存栅栏,内存栅障,屏障指令等,是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作),避免代码重排序。防止指令之间的重排序. 保证数据的可见性. 指令重排中Load和Store两种操作会有Load-Store、Store-Load、Load-Load、Store-Store这四种可能的乱序结果。

CAS 操作

CAS 即比较并替换(Compare And Swap),是实现并发算法时常用到的一种技术。CAS 操作包含三个操作数——内存位置、预期原值及新值。CAS(Compare and Swap)比较并交换,顾名思义:比较两个值,如果他们两者相等就把他们交换。

Class 操作

Unsafe 对Class和它的静态字段的操作相关方法,包含静态字段内存定位、定义类、定义匿名类、检验&确保初始化等。

对象操作

此部分主要包含对象成员属性相关操作及非常规的对象实例化方式等相关方法。

系统相关

这部分包含两个获取系统相关信息的方法。 public native int addressSize(); //返回系统指针的大小。返回值为4(32位系统)或 8(64位系统)。 public native int pageSize();//内存页的大小,此值为2的幂次方。

线程调度

其中包括线程挂起、恢复、锁机制等方法。在Unsafe 类中提供了park、unpark、monitorEnter、monitorExit、tryMonitorEnter方法进行线程调度。

数组相关

这部分主要介绍与数据操作相关的arrayBaseOffset与arrayIndexScale这两个方法,两者配合起来使用,即可定位数组中每个元素在内存中的位置。