Class ObjectProxyCache<T,A>

java.lang.Object
org.jruby.javasupport.util.ObjectProxyCache<T,A>

public abstract class ObjectProxyCache<T,A> extends Object
Maps Java objects to their proxies. Combines elements of WeakHashMap and ConcurrentHashMap to permit unsynchronized reads. May be configured to use either Weak (the default) or Soft references.

Note that both Java objects and their proxies are held by weak/soft references; because proxies (currently) keep strong references to their Java objects, if we kept strong references to them the Java objects would never be gc'ed. This presents a problem in the case where a user passes a Rubified Java object out to Java but keeps no reference in Ruby to the proxy; if the object is returned to Ruby after its proxy has been gc'ed, a new (and possibly very wrong, in the case of JRuby-defined subclasses) proxy will be created. Use of soft references may help reduce the likelihood of this occurring; users may be advised to keep Ruby-side references to prevent it occurring altogether.

  • Field Details

  • Constructor Details

  • Method Details

    • nextId

      private static int nextId()
    • allocateProxy

      public abstract T allocateProxy(Object javaObject, A allocator)
    • get

      public T get(Object javaObject)
    • getOrCreate

      public T getOrCreate(Object javaObject, A allocator)
    • put

      public void put(Object javaObject, T proxy)
    • hash

      private static int hash(Object javaObject)
    • segmentFor

      private ObjectProxyCache.Segment<T,A> segmentFor(int hash)
    • size

      public int size()
      Returns the approximate size (elements in use) of the cache. The sizes of the segments are summed. No effort is made to synchronize across segments, so the value returned may differ from the actual size at any point in time.
      Returns:
    • stats

      public String stats()