Class ObjectProxyCache<T,A>

java.lang.Object
org.jruby.javasupport.util.ObjectProxyCache<T,A>
Type Parameters:
T - the T
A - the 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.

Author:
Bill Dortch
  • Constructor Details

  • Method Details

    • 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)
    • 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()