HW小兵Unsafe操作(一):Unsafe实现队列的put
简介
Unsafe是在sun.misc包下的一个类,可以直接绕过JVM操作堆外内存,拥有极高的性能,但在使用中稍有不慎就会引发内存泄漏,程序崩溃,因此在常见的Java业务代码中几乎看不到Unsafe的身影。
如果有看过atomic包下的类,如AtomicInteger, AtomicLong等源码,其实还是可以找到Unsafe的身影
原子类的CAS方法就依赖了Unsafe的实现。
下面将介绍如何用Unsafe来实现一个队列的基本功能。
队列实现
Unsafe最基本操作
如上代码,首先需要为数据申请一块内存,如存放的类型为long,则需要申请8个字节,然后将内存清空(其实也没有必要,因为long型数据一定会消耗完这8个字节),最后将数据放入申请的地址中;调用getLong方法可以获取该地址存放的实际的值。
定义数据结构
除了META_CAPS之外,其他的通过注释都能理解,META_CAPS的大小为16个字节,及8 + 8,第一个8字节用于存放数据地址,第二个8个字节指向下一个节点,具体流程如下图:
put、poll、size方法实现
性能测试
用2000W个long型数据进行测试,得到的结果如下:
可以看到UnsafeQueue的put操作是快于普通的Queue的,但poll性能不太理想,究其原因是在 poll()中进行了释放内存这一操作,将改行代码注释掉后,性能与普通queue的性能相当:
其实内存的频繁创建与销毁都会带来性能的损耗,之后会慢慢给出相对应的解决方法。
#Java后端实战项目##技术栈##华为##互联网#