什么是直接内存?
直接内存( 堆外内存 ) 指的是 Java 应用程序通过直接方式从操作系统中申请的内存,这块内存不属于jvm
传统方式读取文件
利用直接内存读取文件
直接内存也会出现内存溢出,所以使用时需要小心
/**
* @apiNote 直接内存是通过Unsafe对象的freeMemory方法完成内存释放而不是通过JVM自动垃圾回收
*/
public class Demo10 {
static int _1GB = 1024 * 1024 * 1024;
public static void main(String[] args) throws Exception {
Unsafe unsafe = getUnsafe();
long base = unsafe.allocateMemory(_1GB);//分配直接内存,返回内存地址
unsafe.setMemory(base, _1GB, (byte) 0);
System.in.read();
unsafe.freeMemory(base);//释放内存
System.in.read();
}
public static Unsafe getUnsafe() {
try {
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
return unsafe;
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
ByteBuffer
是怎么声明直接内存和回收内存的呢?
当jvm设置为禁用显式的垃圾回收时,直接内存只有到下次真正的垃圾回收时才会被释放,需要解决这个问题可以通过Unsafe对象手动回收这部分内存
-XX:+DisableExplicitGC //禁用显式的垃圾回收 相当于禁用System.gc()