国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 是一种磁盘物理文件和内存映射的一种方式,可以像操作内存一样操作磁盘文件,它是一种虚拟内存技术,应该是虚拟内存。

    评论

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用