提交 cd33cdd8 编写于 作者: J Jesse Glick

[FIXED JENKINS-24309] Caching class loads and misses from UberClassLoader.

上级 6d298b0a
......@@ -64,6 +64,9 @@ Upcoming changes</a>
<li class=rfe>
Allow BuildStep to work with non-AbstractProject
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-23713">issue 23713</a>)
<li class=bug>
Improved class loading performance when using Groovy.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-24309">issue 24309</a>)
<li class=rfe>
Make the lifetime of queue items cache configurable.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-19691">issue 19691</a>)
......
......@@ -435,6 +435,9 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
plugins.add(p);
activePlugins.add(p);
synchronized (((UberClassLoader) uberClassLoader).loaded) {
((UberClassLoader) uberClassLoader).loaded.clear();
}
try {
p.resolvePluginDependencies();
......@@ -1015,6 +1018,8 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* Keyed by the generated class name.
*/
private ConcurrentMap<String, WeakReference<Class>> generatedClasses = new ConcurrentHashMap<String, WeakReference<Class>>();
/** Cache of loaded, or known to be unloadable, classes. */
private final Map<String,Class<?>> loaded = new HashMap<String,Class<?>>();
public UberClassLoader() {
super(PluginManager.class.getClassLoader());
......@@ -1033,13 +1038,35 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
else generatedClasses.remove(name,wc);
}
if (name.startsWith("SimpleTemplateScript")) { // cf. groovy.text.SimpleTemplateEngine
throw new ClassNotFoundException("ignoring " + name);
}
synchronized (loaded) {
if (loaded.containsKey(name)) {
Class<?> c = loaded.get(name);
if (c != null) {
return c;
} else {
throw new ClassNotFoundException("cached miss for " + name);
}
}
}
if (FAST_LOOKUP) {
for (PluginWrapper p : activePlugins) {
try {
Class<?> c = ClassLoaderReflectionToolkit._findLoadedClass(p.classLoader, name);
if (c!=null) return c;
if (c != null) {
synchronized (loaded) {
loaded.put(name, c);
}
return c;
}
// calling findClass twice appears to cause LinkageError: duplicate class def
return ClassLoaderReflectionToolkit._findClass(p.classLoader, name);
c = ClassLoaderReflectionToolkit._findClass(p.classLoader, name);
synchronized (loaded) {
loaded.put(name, c);
}
return c;
} catch (ClassNotFoundException e) {
//not found. try next
}
......@@ -1053,6 +1080,9 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
}
}
}
synchronized (loaded) {
loaded.put(name, null);
}
// not found in any of the classloader. delegate.
throw new ClassNotFoundException(name);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册