1.直接内存(Direct Memory)概述
1.不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域,不受JVM内存回收管理
2.直接内存是在Java堆外的、直接向系统申请的内存区间来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存
3.通常,访问直接内存的速度会优于Java堆。即读写性能高
4.因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存
5. Java的NIO库允许Java程序使用直接内存,用于数据缓冲区
2.直接内存为什么性能高
如下图,不用直接内存的时候,读取磁盘文件需要先经过系统内存缓存,然后再经过java堆内存缓存编译之后才可以使用
使用直接内存之后,java堆内存和系统内存就变成了直连,直通的java可以直接读磁盘文件
3.分配和回收的原理
直接内存不受JVM内存回收管理
使用了 Unsafe 对象完成直接内存的分配回收,并且回收需要主动调用 freeMemory 方法
ByteBufier 的实现类内部,使用了 Cleaner (虚引用)来监测 ByteBuffer 对象,一旦 BvteBuffer 对象被垃圾回收,那么就会由 ReferenceHandler 线程通过 Cleaner 的 clean 方法调用 freeMemory 来释放直接内存
4.禁用显示回收对直接内存的影响
-XX:+DisableExplicitGC 禁用显示的GC
例如:System.gc();就是显示的垃圾回收,Full GC
System.gc()是一种Full GC 是一种比较影响性能的垃圾回收,不仅要回收新生代,还要回收老年代
如果去去掉了这个虚拟机参数的设置,但是有情况可能有些别的代码,显示的调用System.gc,也会导致垃圾回收,垃圾回收对性能产生影响,可以用到,我们不用java的垃圾回收,可以使用unsafe对象直接调用freeMemory()的方式,来释放直接内存,这是手动的管理直接内存