public class OffHeapConcurrentMap extends Object implements ConcurrentMap<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>, PeekableTouchableMap<WrappedBytes,WrappedBytes>, AutoCloseable
ConcurrentMap implementation that stores the keys and values off the JVM heap in native heap. This map
does not permit null for key or values.
The key and value are limited to objects that implement the WrappedBytes interface. Currently this map only allows
for implementations that always return a backing array via the WrappedBytes.getBytes() method.
For reference here is a list of commonly used terms:
bucket: Can store multiple entries (normally via a forward only list)
memory lookup: Stores an array of buckets - used primarily to lookup the location a key would be
lock region: The number of lock regions is fixed, and each region has bucket count / lock count buckets.
This implementation provides constant-time performance for the basic
operations (get, put, remove and compute), assuming the hash function
disperses the elements properly among the buckets. Iteration over
collection views requires time proportional to the number of buckets plus its size (the number
of key-value mappings). This map always assumes a load factor of .75 that is not changeable.
A map must be started after creating to create the initial memory lookup, which is also store in the native heap. When the size of the map reaches the load factor, that is .75 times the capacity, the map will attempt to resize by increasing its internal memory lookup to have an array of buckets twice as big. Normal operations can still proceed during this, allowing for minimal downtime during a resize.
This map is created assuming some knowledge of expiration in the Infinispan system. Thus operations that do not
expose this information via its APIs are not supported. These methods are keySet, containsKey and
containsValue.
This map guarantees consistency under concurrent read ands writes through a StripedLock where each
ReadWriteLock instance protects an equivalent region of buckets in the underlying
memory lookup. Read operations, that is ones that only acquire the read lock for their specific lock region, are
(get and peek). Iteration on a returned entrySet or value collection will acquire only a single
read lock at a time while inspecting a given lock region for a valid value. Write operations, ones that acquire the
write lock for the lock region, are (put, remove, replace, compute. A clear
will acquire all write locks when invoked. This allows the clear to also resize the map down to the initial size.
When this map is constructed it is also possible to provide an OffHeapConcurrentMap.EntryListener that is invoked when various
operations are performed in the map. Note that the various modification callbacks MUST free the old address,
or else a memory leak will occur. Please see the various methods for clarification on these methods.
Since this map is based on holding references to memory that lives outside of the scope of the JVM garbage collector
users need to ensure they properly invoke the close() when the map is no longer in use to properly free
all allocated native memory.
| Modifier and Type | Class and Description |
|---|---|
static interface |
OffHeapConcurrentMap.EntryListener
Listener interface that is notified when certain operations occur for various memory addresses.
|
| Modifier and Type | Field and Description |
|---|---|
static int |
INITIAL_SIZE |
| Constructor and Description |
|---|
OffHeapConcurrentMap(OffHeapMemoryAllocator allocator,
OffHeapEntryFactory offHeapEntryFactory,
OffHeapConcurrentMap.EntryListener listener) |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitcomputeIfAbsent, computeIfPresent, forEach, getOrDefault, merge, replaceAllpublic static final int INITIAL_SIZE
public OffHeapConcurrentMap(OffHeapMemoryAllocator allocator, OffHeapEntryFactory offHeapEntryFactory, OffHeapConcurrentMap.EntryListener listener)
public boolean touchKey(Object k, long currentTimeMillis)
PeekableTouchableMaptouchKey in interface PeekableTouchableMap<WrappedBytes,WrappedBytes>k - key to touchcurrentTimeMillis - the recency timestamp to setpublic void close()
close in interface AutoCloseablepublic int size()
size in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>public boolean isEmpty()
isEmpty in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>public InternalCacheEntry<WrappedBytes,WrappedBytes> compute(WrappedBytes key, BiFunction<? super WrappedBytes,? super InternalCacheEntry<WrappedBytes,WrappedBytes>,? extends InternalCacheEntry<WrappedBytes,WrappedBytes>> remappingFunction)
compute in interface ConcurrentMap<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>compute in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>public boolean containsKey(Object key)
containsKey in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>public boolean containsValue(Object value)
containsValue in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>public InternalCacheEntry<WrappedBytes,WrappedBytes> get(Object key)
get in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>public InternalCacheEntry<WrappedBytes,WrappedBytes> peek(Object key)
PeekableTouchableMappeek in interface PeekableTouchableMap<WrappedBytes,WrappedBytes>key - The key to find the value forpublic InternalCacheEntry<WrappedBytes,WrappedBytes> put(WrappedBytes key, InternalCacheEntry<WrappedBytes,WrappedBytes> value)
put in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>public InternalCacheEntry<WrappedBytes,WrappedBytes> remove(Object key)
remove in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>public void putAll(Map<? extends WrappedBytes,? extends InternalCacheEntry<WrappedBytes,WrappedBytes>> m)
putAll in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>public void clear()
clear in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>public InternalCacheEntry<WrappedBytes,WrappedBytes> putIfAbsent(WrappedBytes key, InternalCacheEntry<WrappedBytes,WrappedBytes> value)
putIfAbsent in interface ConcurrentMap<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>putIfAbsent in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>public boolean remove(Object key, Object value)
remove in interface ConcurrentMap<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>remove in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>public boolean replace(WrappedBytes key, InternalCacheEntry<WrappedBytes,WrappedBytes> oldValue, InternalCacheEntry<WrappedBytes,WrappedBytes> newValue)
replace in interface ConcurrentMap<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>replace in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>public InternalCacheEntry<WrappedBytes,WrappedBytes> replace(WrappedBytes key, InternalCacheEntry<WrappedBytes,WrappedBytes> value)
replace in interface ConcurrentMap<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>replace in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>public Set<WrappedBytes> keySet()
keySet in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>public Collection<InternalCacheEntry<WrappedBytes,WrappedBytes>> values()
values in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>public Set<Map.Entry<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>> entrySet()
entrySet in interface Map<WrappedBytes,InternalCacheEntry<WrappedBytes,WrappedBytes>>Copyright © 2022 JBoss by Red Hat. All rights reserved.