DirectByteBuffer 里的堆外内存何时释放?

DirectByteBuffer 的堆外内存由 Cleaner 负责管理。在GC时,如果DirectByteBuffer不可达,Cleaner(作为PhantomReference的子类)会被放入pending list,Reference Handler线程会执行Cleaner的clean()方法释放内存。Bits.reserveMemory负责预检查内存,若无足够内存,会尝试触发System.gc。堆外内存可能在YoungGC或FullGC时回收。
摘要由CSDN通过智能技术生成

DirectByteBuffer 里的堆外内存何时释放?

简要答案

DirectByteBuffer 在分配堆外内存时:

  1. 先要通过 Bits.reserveMemory 来看看是否还有可用的内存,是否达到了堆外内存的上限?有的话,占坑。
  2. 通过 unsafe.allocateMemory 分配内存。
  3. 创建 Cleaner,这个 Cleaner 就是用来管理堆外内存的。Cleaner 继承了 PhantomReference,当 GC 时发现它除了 PhantomReference 外已不可达(持有它的 DirectByteBuffer 失效了),就会把它放进 Reference 类 pending list 静态变量里。然后另有一条 ReferenceHandler 线程,名字叫”Reference Handler”的,关注着这个 pending list,如果看到有对象类型是 Cleaner,就会执行它的clean()。
    DirectByteBuffer(int cap) {                   // package-private

        super(-1, 0, cap, cap);
        boolean pa = VM.isDirectMemoryPageAligned();
        int ps = Bits.pageSize();
        long size = Math.max(1L, (long)cap + (pa ? ps : 0));
        Bits.reserveMemory(size, cap);

  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值