Hi,

With Mandy we have prepared the following patch to restore performance of java.lanf.reflect.Proxy class caching that has regressed with introduction of additional checks that have to be performed due to modules:

http://cr.openjdk.java.net/~plevart/jdk9-dev/Proxy.caching/webrev.05/

Jigsaw changed caching of proxy classes from ClassLoader+interfaces to Module+interfaces to accommodate possible future extension of the API that might take given Module as a parameter. Additional validation of constraints and derivation of dynamic module to host proxy class was performed on the fast path, degrading performance. This change restores the caching back to ClassLoader+interfaces, but also introduces new caching mechanism that allows simple derivation of other coexisting caching schemes that can support possible additions to the Proxy API. The new mechanism also simplifies caching by avoiding the need to reference ClassLoader and interfaces through WeakReference objects. Instead it uses a single ConcurrentHashMap per ClassLoader instance referenced directly from ClassLoader object. The caching API - ClassLoaderValue - is general enough to be used for other purposes where caching per ClassLoader is desired. Currently it is encapsulated as a java.lang.reflect package-private API, but could simply be promoted to a public API in an internal concealed package if desired.

Performance of Proxy class caching is back to pre-jigsaw state and even better:

http://cr.openjdk.java.net/~plevart/jdk9-dev/Proxy.caching/ProxyBench.java


@Mandy

I haven't yet removed the superfluous checking and providing access from dynamic module to the modules/packages of transitive closure of interfaces implemented by proxy class. I think this should be done in a separate issue so that this change doesn't change the semantics of implementation.

Regards, Peter

Reply via email to