TUSCANY-3312 - correct previous fix to prevent memory leak on WeakHashMap
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@835844 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
2d3a1e88ae
commit
2e637af925
1 changed files with 8 additions and 4 deletions
|
@ -18,6 +18,7 @@
|
|||
*/
|
||||
package org.apache.tuscany.sca.core.invocation;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.lang.reflect.InvocationHandler;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Proxy;
|
||||
|
@ -33,7 +34,7 @@ public class SCAProxy extends Proxy
|
|||
// This is a cache containing the proxy class constructor for each business interface.
|
||||
// This improves performance compared to calling Proxy.newProxyInstance()
|
||||
// every time that a proxy is needed.
|
||||
private static WeakHashMap cache = new WeakHashMap<String, Object>();
|
||||
private static WeakHashMap cache = new WeakHashMap<Class, WeakReference<Constructor>>();
|
||||
|
||||
public static Object newProxyInstance(ClassLoader classloader, Class aclass[], InvocationHandler invocationhandler)
|
||||
throws IllegalArgumentException
|
||||
|
@ -42,15 +43,18 @@ public class SCAProxy extends Proxy
|
|||
if(invocationhandler == null)
|
||||
throw new NullPointerException();
|
||||
// Lookup cached constructor. aclass[0] is the reference's business interface.
|
||||
Constructor proxyCTOR;
|
||||
Constructor proxyCTOR = null;
|
||||
synchronized(cache) {
|
||||
proxyCTOR = (Constructor) cache.get(aclass[0].hashCode());
|
||||
WeakReference<Constructor> ref = (WeakReference<Constructor>) cache.get(aclass[0]);
|
||||
if (ref != null){
|
||||
proxyCTOR = ref.get();
|
||||
}
|
||||
}
|
||||
if(proxyCTOR == null) {
|
||||
Class proxyClass = getProxyClass(classloader, aclass);
|
||||
proxyCTOR = proxyClass.getConstructor(constructorParams);
|
||||
synchronized(cache){
|
||||
cache.put(aclass[0].hashCode(),proxyCTOR);
|
||||
cache.put(aclass[0],new WeakReference<Constructor>(proxyCTOR));
|
||||
}
|
||||
}
|
||||
return proxyCTOR.newInstance(new Object[] { invocationhandler });
|
||||
|
|
Loading…
Reference in a new issue