直接内存:
常见于NIO操作,用于数据缓冲区
分配回收成本较高,但读写速度快。
磁盘文件 先进入到系统缓存区,再复制到Java缓冲区
直接内存,在操作系统和Java内存都可以读取。
不受JVM内存回收管理。
直接内存的释放,需要调用unsafe.freeMemory()方法来释放
分配和回收原理:
使用了Unsafe对象完成直接内存的分配回收,并且回收需要调用freeMemory方法。
ByteBuffer的实现类内部,使用了Cleaner虚引用来检测ByteBuffer对象,一旦对象被垃圾回收,就会由ReferenceHandler线程通过Cleaner的clean方法调用free Memory来释放直接内存。
-XX:+DisableExplicitGC 显式的禁用System.gc()。推荐用Unsafe的freeMemory