直接内存
直接内存是操作系统内存,常见于NIO操作,用于数据缓冲区
分配回收成本高,但是读写性能高
不受垃圾回收管理
为什么使用ByteBuffer或者说直接内存读写效率高?
java本身没有磁盘读写能力,要调用本地方法来处理
java要想访问系统磁盘中数据,要先从系统缓冲区将数据读入到java缓冲区,
再从Java缓冲区来读数据,再写入操作
ByteBuffer bb=ByteBuffer.allocateDirect(_1MB)
但是用了ByteBuffer直接内存.会直接在系统缓冲区搞一个缓冲区,
java可以访问到这个缓冲区,速度更快
直接内存会溢出: OutOfMemoryError
直接内存会被回收:
释放原理: Unsafe类,用来分配和处理直接内存的
一般不会使用,一般是jdk内部使用的
long addr=unsafe.allocateMemory(_1GB); //设置内存大小
void unsafe.freeMemory(addr); //释放内存
当ByteBuffer被垃圾回收的时候,自动会调用Cleaner类中clean方法
clean方法中会执行Unsafe类中的freeMemory方法
分配与回收原理:
-XX:+DisableExplicitGC 禁用显式垃圾回收
也就是禁用 System.gc(); 来进行垃圾回收
因为显式垃圾回收用的是FUll GC,要回收新生代和老年代,让程序暂停时间长,非常耗性能
所以一般会禁用