DirectBuffer的释放探究

2020-11-23  本文已影响0人  江江的大猪

个人认为rocket两个核心技术一个是网络io,一个是文件io。看到MappedByteBuffer的时候对内存映射的释放逻辑产生了疑惑

基础知识

        File file = new File("xxx");
        FileChannel fileChannel = new RandomAccessFile(file, "rw").getChannel();
        MappedByteBuffer mappedByteBuffer = fileChannel.map(MapMode.READ_WRITE, 0, 4096);

image.png

所以根据Cleaner的工作原理就能够理解,为什么网上那么多资料说直接内存会随着gc被回收,有些人甚至在需要主动回收直接内存时直接调用System.gc()

进阶部分

java9前:sun.misc.Cleaner
java9后:java.lang.ref.Cleaner

CleanerJava6根据jdk是否有Unsafe类决定通过Unsafe方法还是反射,调用DirectByteBuffer中Cleaner属性的clean()方法

image.png

CleanerJava9直接通过反射调用Unsafe的invokeCleaner()方法(invokeCleaner在java9后才有),内部也是调用的DirectByteBuffer中Cleaner属性的clean()方法

image.png

rocket中的做法

image.png

疑惑思考

相当于用hotspot编译之后再openjdk上运行,就会报错 https://stackoverflow.com/questions/54323645/apache-spark-method-not-found-sun-nio-ch-directbuffer-cleanerlsun-misc-cleaner

上一篇 下一篇

猜你喜欢

热点阅读