国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 运筹学中在线排序的时间在线排序的在线LPT算法
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧