On 03/09/2014 13:41, Peter Levart wrote:
DirectByteBuffers rely on Cleaner(s), which are PhanthomReferences and
are managed (invoked) by the ReferenceHandler thread directly.
Finalizers are just enqueued by ReferenceHandler thread, but they are
invoked by the special FinalizerThread. That's because Cleaner(s) are
internal JDK mechanism, while finalizers invoke client code so they
can stall the FinalizerThread. A bug in a client code can bring
FinalizerThread to a halt.
Indeed and there is many a war story of badly written finalizers.
On direct buffers the recommendation has always been to cache those as
there is a significant cost to allocation (there is wording on this in
javadoc). Sometimes you can find code that repeatedly allocates, uses
once and discards and this can certainly cause performance issues (and
potentially OOME prior to your changes in this area).
-Alan