Class ThreadLocalBufferManager

java.lang.Object
com.fasterxml.jackson.core.util.ThreadLocalBufferManager

class ThreadLocalBufferManager extends Object
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
  • Field Details

    • RELEASE_LOCK

      private final ReentrantLock 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

      private final Map<SoftReference<BufferRecycler>,Boolean> _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 SoftReference has its equals() and hashCode() implementations defined so that they use object identity, so we do not need to use something like IdentityHashMap

    • _refQueue

      private final ReferenceQueue<BufferRecycler> _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

      public static ThreadLocalBufferManager 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

      public SoftReference<BufferRecycler> wrapAndTrack(BufferRecycler br)
    • removeSoftRefsClearedByGc

      private void removeSoftRefsClearedByGc()
      Remove cleared (inactive) SoftRefs from our set. Gc may have cleared one or more, and made them inactive.