Package com.fasterxml.jackson.core.util
Class ThreadLocalBufferManager
java.lang.Object
com.fasterxml.jackson.core.util.ThreadLocalBufferManager
For issue [jackson-core#400] We keep a separate Set of all SoftReferences to BufferRecyclers
which are (also) referenced using `ThreadLocals`.
We do this to be able to release them (dereference) in `releaseBuffers()` and `shutdown()`
method to reduce heap consumption during hot reloading of services where otherwise
ClassLoader would have dangling reference via ThreadLocals.
When gc clears a SoftReference, it puts it on a newly introduced referenceQueue.
We use this queue to release the inactive SoftReferences from the Set.- Since:
- 2.9.6
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate static final classThreadLocalBufferManagerHolder uses the thread-safe initialize-on-demand, holder class idiom that implicitly incorporates lazy initialization by declaring a static variable within a static Holder inner class -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final ReferenceQueue<BufferRecycler> Queue where gc will put just-cleared SoftReferences, previously referencing BufferRecyclers.private final Map<SoftReference<BufferRecycler>, Boolean> A set of all SoftReferences to all BufferRecyclers to be able to release them on shutdown.private final ReentrantLockA lock to make sure releaseBuffers is only executed by one thread at a time since it iterates over and modifies the allSoftBufRecyclers. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic ThreadLocalBufferManagerinstance()Returns the lazily initialized singleton instanceintReleases the buffers retained in ThreadLocals.private voidRemove cleared (inactive) SoftRefs from our set.
-
Field Details
-
RELEASE_LOCK
A lock to make sure releaseBuffers is only executed by one thread at a time since it iterates over and modifies the allSoftBufRecyclers. -
_trackedRecyclers
A set of all SoftReferences to all BufferRecyclers to be able to release them on shutdown. 'All' means the ones created by this class, in this classloader. There may be more from other classloaders. We use a HashSet to have quick O(1) add and remove operations.NOTE: assumption is that
SoftReferencehas itsequals()andhashCode()implementations defined so that they use object identity, so we do not need to use something likeIdentityHashMap -
_refQueue
Queue where gc will put just-cleared SoftReferences, previously referencing BufferRecyclers. We use it to remove the cleared softRefs from the above set.
-
-
Constructor Details
-
ThreadLocalBufferManager
ThreadLocalBufferManager()
-
-
Method Details
-
instance
Returns the lazily initialized singleton instance -
releaseBuffers
public int releaseBuffers()Releases the buffers retained in ThreadLocals. To be called for instance on shutdown event of applications which make use of an environment like an appserver which stays alive and uses a thread pool that causes ThreadLocals created by the application to survive much longer than the application itself. It will clear all bufRecyclers from the SoftRefs and release all SoftRefs itself from our set. -
wrapAndTrack
-
removeSoftRefsClearedByGc
private void removeSoftRefsClearedByGc()Remove cleared (inactive) SoftRefs from our set. Gc may have cleared one or more, and made them inactive.
-