【发布时间】:2015-04-23 04:45:53
【问题描述】:
根据Netty in Action v10这本书,reference counting是用来处理ByteBuf的池化的。但是 JVM 不知道 netty 引用计数,所以 JVM 仍然可以 GC ByteBuf。如果是这样,为什么我们还需要关心引用计数并手动调用release()方法?
我引用了《Netty in Action v10》一书中的一些内容来添加一些上下文。
引用计数的权衡之一是用户必须 使用消息时要小心。虽然 JVM 仍然能够 GC 这样的消息(因为它不知道引用计数)这个 消息不会被放回可以从中获取消息的池中 前。因此,您很有可能会在 如果您不小心发布这些消息,则为一分。
还有一些相关的话题: Buffer ownership in Netty 4: How is buffer life-cycle managed?
https://blog.twitter.com/2013/netty-4-at-twitter-reduced-gc-overhead
添加 1
(以下是我的一些理解。)
ByteBuf 可以从两个角度进行分类:
1. Pooled or Unpooled
2. Heap-based or Direct
所以可以有4种组合:
(a) Pooled Heap-based
(b) Pooled Direct
(c) Unpooled Heap-based
(d) Unpooled Direct
只有 (a) 和 (c) 受 JVM GC 机制影响,因为它们是基于堆的。
在上述
一个终极规则是,如果一个 Java 对象被 GCed,它就完全消失了。所以下面是我认为 Netty 所做的:
对于 (a),Netty 分配器必须诱使 JVM GC 相信对象永远不应该被 GC。然后使用引用计数将对象移出/移回池中。 这是另一种形式的生命周期。
对于 (b),不涉及 JVM GC,因为它不是基于 JVM 堆的。 Netty 分配器需要使用引用计数将对象移出/移回池中。
对于(c),JVM GC 完全负责控制对象的生命周期。 Netty 分配器只是提供了分配对象的 API。
对于 (d),不涉及 JVM GC。并且不需要池化。所以Netty分配器只需要提供分配/释放对象的API即可。
【问题讨论】:
标签: netty