要是我回答的话我大概会这么说: 在我看来根本就不存在直接内存的GC这一说法。Netty 也好ES也好kafka也好,在版本迭代中把一部分数据结构放到堆外就是为了防止GC的随机性带来的抖动。这是语义层面,对于堆外的内存我更倾向的说法是归还或者释放。 java服务是一个进程,向os申请了一块内存(大内存申请一般是依赖mmap这个系统调用),而且这块内存不归jvm管。jvm内部只维护一个指向堆外内存的指针而已。 使用者必须要全权负责这块内存的生命周期。所以一般的策略是将其池化,引入相关的策略管理这片“非法”区域——可以参考一下netty的做法。 至于所谓的gc,其实就是将申请的内存归还操作系统。这部分只能交由jvm做,我记得应该是在回收bufferpool对象时执行它的销毁方法从而归还该块内存。
点赞 6

相关推荐

牛客网
牛客网在线编程
牛客网题解
牛客企业服务