Thanks for your explanation. Reusing the corrupted recycle object is dangerous, 
and it's hard to investigate issues from the heap dump.

Thanks,
Ran Gao

On 2025/07/17 13:38:38 Lari Hotari wrote:
> Recycling can cause bugs that are very hard to detect. The main reason to 
> avoid recycling in exceptional cases is to prevent such bugs. One possible 
> scenario is when another thread continues to hold a reference to an object 
> instance. After the object instance has been recycled, it could refer to a 
> completely different object instance. We have encountered such bugs in the 
> past with Pulsar, which is why it's better to avoid the risk of these bugs 
> altogether.
> 
> Netty doesn't recycle all object instances when recycling is enabled. There's 
> currently a per-thread limit of 4,096 object instances by default. Omitting 
> recycling in exceptional paths won't add noticeable extra GC pressure because 
> many instances will be discarded in any case, due to recycling cache overflow 
> when using default Netty settings.
> 
> -Lari
> 
> On 2025/07/17 12:47:22 Yunze Xu wrote:
> > Hi all,
> > 
> > I noticed there is a difference of opinion for whether to recycle
> > failed recyclable objects. [1][2][3] So I'd like to open the
> > discussion in the mail list.
> > 
> > Netty recycler is an object pool to reduce GC pressure for frequently
> > created and discarded objects. If a recyclable object fails, e.g. when
> > an `OpAddEntry` encounters an unexpected exception, IMO, it's
> > reasonable not to recycle it.
> > 
> > When a recyclable object is not recycled, it just won't be reused from
> > the object pool. The worst case is that the memory of the whole object
> > pool is exhausted. After that
> > 
> > It's true that if such objects are not recycled, there will be a
> > "memory leak". However, the worst result is that the pool memory is
> > exhausted. In this case, it will fall back to allocating objects via
> > the `newObject` method with a dummy handle [4]. The implementation of
> > this method usually allocates memory from JVM. In such cases, the
> > recyclable object will eventually be garbage collected.
> > 
> > It's actually not a memory leak. Recyclable objects usually have short
> > life timing, for example, an `OpAddEntry` object is created when
> > starting an asynchronous send and recycled after the send is done. The
> > object is never referenced by any other object, so even if it's
> > allocated from JVM, it will eventually be garbage collected.
> > 
> > The benefit to skip recycling objects for failures is that for rare
> > cases, retaining the object could help diagnose issues that are hard
> > to reproduce. Still take `OpAddEntry` for example, if it encountered
> > an unexpected exception, recycling it could set all fields with null,
> > so it's hard to know which ledger it belongs to (and other useful
> > fields) from the heap dump.
> > 
> > [1] https://github.com/apache/pulsar/pull/24515#discussion_r2212602435
> > [2] https://github.com/apache/pulsar/pull/24522#discussion_r2210814071
> > [3] https://github.com/apache/pulsar/pull/24522#discussion_r2213100905
> > [4] 
> > https://github.com/netty/netty/blob/ab2d2cf3ff3a6f055368405af7f6e9dd5b8d144e/common/src/main/java/io/netty/util/Recycler.java#L189
> > 
> > Thanks,
> > Yunze
> > 
> 

Reply via email to