您的位置 首页 java

jdk源码(一):你知道用java如何直接操作内存码?

1、用什么操作内存?

sun.misc.Unsafe 这个类来操作,这个jdk自带的 

2、怎么用呢?

如果我们打开这个Unsafe类,你很可能会这样获取,

但是这样获取不到的,因为这个方法是Caller敏感的,看代码

从代码中我们发现,只有当前调用这个getUnsafe()方法的类的ClassLoader==null 才可以正常使用,ClassLoader==null意味着调用这个方法的类是jdk中C代码加载的,这里不赘述。

正确的使用方式:使用反射获取,看代码

3、使用Unsafe 操作成员变量

以上是unsfae.get*()和unsafe.put*() 等操作变量的方法,具体unsfae.get*Volatile(),unsfae.put*Volatile(),只不多是多Volatile语义,关于Volatile 具体可以查看

java /j-jtp06197.html

4、操作数组

如代码操作数组,非常高效,在jdk内部用的非常多,比如ConcurrentHashMap里就用到了

注:UnsafeObject这个类在第3点里

5、内存操作

6、使用场景

一般的话,讲究极致性能的,我们可以使用unsafe,比如 netty ,就用到了。但是如果使用的话要兼容各个版本的jdk。在业务系统里,不建议使用,如果搞不到很可能导致 内存泄露

7、总结

这个类还没完全分析完,有待更新

为什么要写这个?

主要是在分析ConcurrentHashMap代码时遇到Unsafe,所以就想分析分析,为分析ConcurrentHashMap做准备。

如果想了解ConcurrentHashMap,请关注,后续持续更新。

代码地址:

jdk版本:jdk7_75

如果不对,请赐教!

持续更新有意思的代码

欢迎关注头条号:听柳

文章来源:智云一二三科技

文章标题:jdk源码(一):你知道用java如何直接操作内存码?

文章地址:https://www.zhihuclub.com/188644.shtml

关于作者: 智云科技

热门文章

网站地图