直接内存
定义(Direct Memory)
1.常见于 NIO 操作时,用于数据缓冲区。
2.分配回收成本较高,但读写性能高。
3.不受 JVM 内存回收管理。
4.本机直接内存的分配不会受到Java 堆大小的限制,受到本机总内存大小限制。
5.配置虚拟机参数时,不要忽略直接内存,防止出现OutOfMemoryError异常。
从这两张图能明显看出直接内存的重要性,避免了原来的两次缓冲,节约了内存空间,缩短了运行时间。
直接内存使用场景
1.有很多很大的数据需要存储,它的生命周期很长。
2.适合频繁的IO操作,例如网络并发场景。
分配和回收原理
使用了 Unsafe 对象完成直接内存的分配回收,并且回收需要主动调用 freeMemory 方法。
ByteBuffer 的实现类内部,使用了 Cleaner (虚引用)来监测 ByteBuffer 对象,一旦ByteBuffer 对象被垃圾回收,那么就会由 ReferenceHandler 线程通过 Cleaner 的 clean 方法调
用 freeMemory 来释放直接内存。