public V put(K key, V value) {
    expunge();
    if (key == null) {
      throw new IllegalArgumentException("Null key");
    }
    WeakReference<K> keyref = makeReference(key, refQueue);
    return map.put(keyref, value);
  }
<p>
A map where keys are compared using identity comparison (like IdentityHashMap) but where the
presence of an object as a key in the map does not prevent it being garbage collected (like
WeakHashMap). This class does not implement the Map interface because it is difficult to ensure
correct semantics for iterators over the entrySet().
<p>
Because we do not implement Map, we do not copy the questionable interface where you can call
get(k) or remove(k) for any type of k, which of course can only have an effect if k is of type K.
<p>
This map does not support null keys.
<p>
The approach is to wrap each key in a WeakReference and use the wrapped value as a key in an
ordinary HashMap. The WeakReference has to be a subclass IdentityWeakReference (IWR) where two
IWRs are equal if they refer to the same object. This enables us to find the entry again.

<p>
Note: this code came from the jdk from the package: com.sun.jmx.mbeanserver. I modified it to use
a ConcurrentMap.

@since GemFire 6.6
geode-core/src/main/java/org/apache/geode/pdx/internal/WeakConcurrentIdentityHashMap.java