国Q躺平中 2019-09-20 15:08 采纳率: 100%
浏览 229

关于直接/非直接字节缓冲区的相关问题

对于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呢。

我说的比较乱 因为我的理解也不是很好见谅

  • 写回答

1条回答 默认 最新

  • 毕小宝 领域专家: 后端开发技术领域 2019-09-20 16:47
    关注

    说说我的理解啊,权当参考,不喜勿喷哈!
    allocate 分配的内存是堆内存,跟普通对象分配的内存一样,在 jvm管理范围内,可以通过 GC 回收,属于用户空间的物理内存。
    directAllocate 分配的内存则不是由 jvm 管理,GC 时不会回收该部分内存,可以理解成是类似C++那种分配的内存,是直接由操作系统分配的,属于系统空间的物理内存。
    而 MappedByteBuffer 是一种磁盘物理文件和内存映射的一种方式,可以像操作内存一样操作磁盘文件,它是一种虚拟内存技术,应该是虚拟内存。

    评论

报告相同问题?