class ThreadLocalBufferManager
extends java.lang.Object
ClassLoader
would have dangling reference via ThreadLocal
s.
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.Modifier and Type | Class and Description |
---|---|
private static class |
ThreadLocalBufferManager.ThreadLocalBufferManagerHolder
ThreadLocalBufferManagerHolder 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
|
Modifier and Type | Field and Description |
---|---|
private java.lang.ref.ReferenceQueue<BufferRecycler> |
_refQueue
Queue where gc will put just-cleared SoftReferences, previously referencing BufferRecyclers.
|
private java.util.Map<java.lang.ref.SoftReference<BufferRecycler>,java.lang.Boolean> |
_trackedRecyclers
A set of all SoftReferences to all BufferRecyclers to be able to release them on shutdown.
|
private java.lang.Object |
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.
|
Constructor and Description |
---|
ThreadLocalBufferManager() |
Modifier and Type | Method and Description |
---|---|
static ThreadLocalBufferManager |
instance()
Returns the lazily initialized singleton instance
|
int |
releaseBuffers()
Releases the buffers retained in ThreadLocals.
|
private void |
removeSoftRefsClearedByGc()
Remove cleared (inactive) SoftRefs from our set.
|
java.lang.ref.SoftReference<BufferRecycler> |
wrapAndTrack(BufferRecycler br) |
private final java.lang.Object RELEASE_LOCK
private final java.util.Map<java.lang.ref.SoftReference<BufferRecycler>,java.lang.Boolean> _trackedRecyclers
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
private final java.lang.ref.ReferenceQueue<BufferRecycler> _refQueue
public static ThreadLocalBufferManager instance()
public int releaseBuffers()
public java.lang.ref.SoftReference<BufferRecycler> wrapAndTrack(BufferRecycler br)
private void removeSoftRefsClearedByGc()