直接内存是系统内存;不属于JVM部分
直接内存定义
- 常见于NIO操作时,用于数据缓冲区
- 分配回收成本较高,但读写性能高
- 不受JVM内存回收管理
直接内存的基本使用
使用 io 函数进行读写文件后:
使用 directBuffer 函数后,运行速度明显变快了;
直接内存的出现,使得Java代码和系统内存都可以进行访问,省去了第一张图中分别开辟两块缓冲区内存,如此速度得到了提升;直接内存比较适合做文件的操作;
例题:演示直接内存溢出
输出36,提示信息:java.lang.outOfMemoryError: Direct buffer memory
直接内存的释放原理
例题:演示直接内存释放
这里查看内存大小不能使用前面的JVM工具,要使用任务管理器进行查看;
运行之后发现结果和上一张图一致,说明直接内存的内存释放,并不是通过垃圾回收器进行回收的,而是通过 unsafe 进行回收的;Java中的垃圾回收不需要我们去手动释放内存,它会自动释放内存,但是在直接内存中,它不会自动释放内存,需要手动调用 unsafe 中的 freeMemory 方法进行内存释放;
总结:分配和回收原理
- 使用了Unsafe对象完成直接内存的分配回收,并且回收需要主动调用freeMemory方法
- ByteBuffer的实现类内部,使用了Cleaner(虚引用)来监测ByteBuffer对象,一旦ByteBuffer对象被垃圾回收,那么就会由ReferenceHandler线程通过Cleaner的clean方法调用freeMemory来释放直接内存
禁用显式回收对直接内存的影响
因为此时不能进行垃圾回收,只能借助直接内存来释放内存;