use ClassLoaderLeakPreventor to reduce ClassLoaderLeaks of plugins

This commit is contained in:
Sebastian Sdorra
2019-06-19 11:52:20 +02:00
parent 6cee35a9f1
commit 91fd259f07
12 changed files with 341 additions and 56 deletions

View File

@@ -48,16 +48,7 @@ public class ChildFirstPluginClassLoader extends ChildFirstURLClassLoader
implements PluginClassLoader
{
/**
* Constructs ...
*
*
* @param urls
*/
public ChildFirstPluginClassLoader(URL[] urls)
{
super(urls);
}
private final String plugin;
/**
* Constructs ...
@@ -66,8 +57,14 @@ public class ChildFirstPluginClassLoader extends ChildFirstURLClassLoader
* @param urls
* @param parent
*/
public ChildFirstPluginClassLoader(URL[] urls, ClassLoader parent)
public ChildFirstPluginClassLoader(URL[] urls, ClassLoader parent, String plugin)
{
super(urls, parent);
this.plugin = plugin;
}
@Override
public String toString() {
return ChildFirstPluginClassLoader.class.getName() + " for plugin " + plugin;
}
}

View File

@@ -46,16 +46,7 @@ public class DefaultPluginClassLoader extends URLClassLoader
implements PluginClassLoader
{
/**
* Constructs ...
*
*
* @param urls
*/
public DefaultPluginClassLoader(URL[] urls)
{
super(urls);
}
private final String plugin;
/**
* Constructs ...
@@ -64,8 +55,14 @@ public class DefaultPluginClassLoader extends URLClassLoader
* @param urls
* @param parent
*/
public DefaultPluginClassLoader(URL[] urls, ClassLoader parent)
public DefaultPluginClassLoader(URL[] urls, ClassLoader parent, String plugin)
{
super(urls, parent);
this.plugin = plugin;
}
@Override
public String toString() {
return DefaultPluginClassLoader.class.getName() + " for plugin " + plugin;
}
}

View File

@@ -41,6 +41,7 @@ import com.google.common.collect.Sets;
import com.google.common.hash.Hashing;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.boot.ClassLoaderLifeCycle;
import sonia.scm.plugin.ExplodedSmp.PathTransformer;
import javax.xml.bind.JAXBContext;
@@ -105,14 +106,18 @@ public final class PluginProcessor
//~--- constructors ---------------------------------------------------------
private ClassLoaderLifeCycle classLoaderLifeCycle;
/**
* Constructs ...
*
*
* @param classLoaderLifeCycle
* @param pluginDirectory
*/
public PluginProcessor(Path pluginDirectory)
public PluginProcessor(ClassLoaderLifeCycle classLoaderLifeCycle, Path pluginDirectory)
{
this.classLoaderLifeCycle = classLoaderLifeCycle;
this.pluginDirectory = pluginDirectory;
this.installedDirectory = findInstalledDirectory();
@@ -372,18 +377,17 @@ public final class PluginProcessor
URL[] urlArray = urls.toArray(new URL[urls.size()]);
Plugin plugin = smp.getPlugin();
String id = plugin.getInformation().getId(false);
if (smp.getPlugin().isChildFirstClassLoader())
{
logger.debug("create child fist classloader for plugin {}",
plugin.getInformation().getId());
classLoader = new ChildFirstPluginClassLoader(urlArray,
parentClassLoader);
logger.debug("create child fist classloader for plugin {}", id);
classLoader = classLoaderLifeCycle.createChildFirstPluginClassLoader(urlArray, parentClassLoader, id);
}
else
{
logger.debug("create parent fist classloader for plugin {}",
plugin.getInformation().getId());
classLoader = new DefaultPluginClassLoader(urlArray, parentClassLoader);
logger.debug("create parent fist classloader for plugin {}", id);
classLoader = classLoaderLifeCycle.createPluginClassLoader(urlArray, parentClassLoader, id);
}
return classLoader;

View File

@@ -41,6 +41,7 @@ import com.google.common.io.Files;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.boot.ClassLoaderLifeCycle;
import sonia.scm.util.IOUtil;
//~--- JDK imports ------------------------------------------------------------
@@ -86,13 +87,13 @@ public final class PluginsInternal
*
* @throws IOException
*/
public static Set<PluginWrapper> collectPlugins(ClassLoader classLoader,
Path directory)
public static Set<PluginWrapper> collectPlugins(ClassLoaderLifeCycle classLoaderLifeCycle,
Path directory)
throws IOException
{
PluginProcessor processor = new PluginProcessor(directory);
PluginProcessor processor = new PluginProcessor(classLoaderLifeCycle, directory);
return processor.collectPlugins(classLoader);
return processor.collectPlugins(classLoaderLifeCycle.getBootstrapClassLoader());
}
/**