【问题标题】:Netty - Is there a need to free memory of Unpooled.unreleasableBufferNetty - 是否需要释放 Unpooled.unreleasesableBuffer 的内存
【发布时间】:2018-07-19 02:53:43
【问题描述】:

说,我们在 MyClass 中声明:

ByteBuf fixedBuf = Unpooled.unreleasableBuffer(
                       PooledByteBufAllocator.DEFAULT.directBuffer(64, 64));

这应该保留一个 64 字节的堆外内存块。如文档所述,Netty 在这里忽略了“release()”和“retain()”功能,因此,该块在 MyClass 的整个生命周期中保持分配状态。一旦 MyClass 的实例超出范围,分配的堆外内存块会发生什么? JVM/GC 会释放它吗?如果没有,或者如果我想以编程方式丢弃“fixedBuf”,我怎样才能最好地为此类 ByteBuf 对象释放声明的内存块?

您是否还可以指出避免 ByteBuf 对象上的任何内存泄漏和问题的解释/示例/最佳实践?

【问题讨论】:

    标签: java netty


    【解决方案1】:

    (仅限 JVM)如果在堆 GC 期间默认情况下在 JVM 中没有对直接缓冲区的引用但不受堆压力影响,那么似乎将清理直接缓冲区,因此根据之前的堆栈溢出问题可能需要手动清理. Stack Overflow 1, Stack Overflow 2

    (对于 Netty)由于 Netty 引用了直接缓冲区,我认为它不会清理它,直到 PoolThreadCache 运行方法 free() 手动使用 Netty Internal/Cleaners 发生在 PoolThreadCache.java 的 finalize 块和其他位置。如果您超出范围,它应该在PoolThreadCache.java 使用免费时自动清理;但我还没有追查到什么时候发生这种情况。如果有疑问,请使用Unpooled.unwrap() 并自行发布。

    在 netty/netty/issues/8139 上发布了一些工作说明,其中我展示了使用其源代码查找答案的步骤。 Is there a need to free memory of Unpooled.unreleasableBuffer #8139

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 2023-03-29
      • 1970-01-01
      • 2014-10-05
      相关资源
      最近更新 更多