gpt4 book ai didi

java - 使用 Java 中的 GroovyClassLoader - 类没有被 GC

转载 作者:行者123 更新时间:2023-12-04 05:15:28 24 4
gpt4 key购买 nike

我在 java 中创建了一个自定义类,用于自定义加载 Groovy 类。

我的 Java 类是这样开始的:

public class ClassLoader {
private GroovyClassLoader groovyClassLoader = new GroovyClassLoader();

然后我有一个使用 groovyClassLoader 的方法按名称加载类:
Class c = groovyClassLoader.loadClass(className, true, false, true);

这一切正常,没有问题。然而,我偶尔想动态地重新加载我所有的 Groovy 类,所以目前我的 java 代码基本上只是重新实例化我的 ClassLoader实例。这不会留下对 ClassLoader 的引用。例如,正如您所期望的那样,这就是 GC。

但是,如果我在重新加载几次后检查加载的类(使用 VisualVM 和 MAT),我会看到 Java 类 ClassLoader只加载一次,只有一个实例,但有多个 GroovyClassLoader$InnerLoader 实例(在这种情况下,类加载一次,但有多个实例)和为 GroovyClassLoader 加载的几个类(如 GroovyClassLoader$1GroovyClassLoader$2 等)

任何想法为什么尽管有 Java ClassLoader正在收集, GroovyClassLoader并且它的 InnerLoader 没有被收集?

谢谢!

最佳答案

也许仍然有一些可达的对象是类之一的实例 c你按名字加载的?每个类都持有对其定义类加载器的引用,因此在它加载的所有类的所有实例都无法访问之前,类加载器不能被 GCd。

如果这还不够,那么问题可能出在 Groovy MetaClass 机制上。您可能需要从 MetaClassRegistry 中明确删除您的类。当您完成您的 com.example.ClassLoader实例:

public void destroy() {
for(Class<?> c : groovyClassLoader.getLoadedClasses()) {
GroovySystem.getMetaClassRegistry().removeMetaClass(c);
}
}

我本来希望 Groovy 为您做这件事,但您可能需要比默认情况下更积极主动。

关于java - 使用 Java 中的 GroovyClassLoader - 类没有被 GC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14343393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com