对于ByteBuffer 可以通过allocateDirect()来创建缓冲区。那MappedByteBuffer 他应该也是直接字节缓冲区吧。
问题:
1. 他们两个的区别
2.ByteBuffer .allocateDirect(); 是不是也创建了映射文件。
3.他们在使用的时候创建的是什么内存(物理还是什么),这个内存会不会被GC回收或者被jvm去控制。()
static void reserveMemory(long size) {
synchronized (Bits.class) {
if (!memoryLimitSet && VM.isBooted()) {
maxMemory = VM.maxDirectMemory();
memoryLimitSet = true;
}
if (size <= maxMemory - reservedMemory) {//如果创建直接缓冲区后的内存占用不超过最大内存限制
reservedMemory += size;//更新已分配的内存大小
return;
}
}
//如果超过最大内存限制,执行垃圾回收
System.gc();
try {
Thread.sleep(100);//等待垃圾回收完成
} catch (InterruptedException x) {
// Restore interrupt status
Thread.currentThread().interrupt();
}
synchronized (Bits.class) {
if (reservedMemory + size > maxMemory)//如果依然超过最大内存限制,则抛出内存溢出异常
throw new OutOfMemoryError("Direct buffer memory");
reservedMemory += size;
}
这个是allocateDirect里调用的方法 他确实是对于内存不够是进行了GC。那MappedByteBuffer呢。
我说的比较乱 因为我的理解也不是很好见谅