2015-02-06 69 views
0

当我们创建一个ByteBuffer,然后不断重用它时,Java不会对其进行GC操作。Netty是否通过字节缓冲区释放GC?

Netty为其输入和输出提供ByteBuffers。

是否通过保持内部定位来持续重用这些内容,以便缓冲区永远不需要垃圾回收?

或者必须由执行者做一些特殊的事情来确保没有GC?

+1

回收缓冲区减少了垃圾,但netty并没有消除它,它试图将其减少到不再对性能产生重大影响的程度。 – 2015-02-06 14:45:16

+0

对,通常情况下,使用零GC的程序会使性能更差,而不是根据需要创建和丢弃一些对象。我的帖子是关于IO内存空间的。我认为,职位追踪等将超出此职位的范围。 – BAR 2015-02-06 15:08:52

+0

“内部定位”是什么意思? AFAIK它保留一个ObjectPool。 – 2015-02-06 15:59:33

回答

1

Netty 4使用引用计数来管理ByteBuf的生命周期。当释放池化缓冲区时,底层内存区域将返回到池中,以便内存区域不被垃圾收集。当释放一个unpooled缓冲区时,底层内存区域会被显式释放,或设置为null,以便JVM稍后清理它。当然,建议使用池缓冲区。

引用计数拥有垃圾收集的优势:

  • 它可以实现一个缓冲池或分配器。
  • 可以按时释放堆外缓冲区。

我们希望实现一个缓冲池或按时间释放off-heap缓冲区而不需要引用计数,但是一旦JVM中的对象变得无法访问,就无法获得通知。

+0

为什么不简单地清除字节缓冲区,或将其用作循环字节缓冲区? – BAR 2015-02-07 03:40:15

+0

嗨,Trustin,我不认为,一旦一个对象变得无法获得通知也无济于事。那是因为这些检测不是确定性的,也是GC本身。所以你最终会等待通知,而RAM正在填满。引用计数是这里唯一的理智技巧。在C++中,你没有其他选择。智能指针实际上只是被引用的计数指针。我认为这很好。敬请期待Java 9,不安全可能会成为JDK的一部分,然后=)。 – Kr0e 2015-03-20 11:53:37

+0

实际上,您可以使用WeakReferences或SoftReferences,创建时您可以提供一个ReferenceQueue,它可以在新参考无法访问时通知您。有关更多信息,请参阅http://stackoverflow.com/questions/14450538/using-javas-referencequeue#14450693。 – 2017-01-12 08:08:55