相关疑难解决方法(0)

在java中卸载类?

我有一个自定义类加载器,以便桌面应用程序可以动态地从我需要与之交谈的AppServer加载类.我们之所以这样做是因为要做这件事所需的罐子数量是荒谬的(如果我们想要运送它们).如果我们不在运行时从AppServer库动态加载类,我们也会遇到版本问题.

现在,我遇到了一个问题,我需要与两个不同的AppServer交谈,并发现根据我首先加载的类我可能会破坏...有没有办法强制卸载类而不实际杀死JVM?

希望这是有道理的

java classloader

170
推荐指数
5
解决办法
13万
查看次数

何时以及如何将java类加载器标记为垃圾收集?

我们正在创建多个子类加载器,以将多个子应用程序加载到Java应用程序"容器"中,进行热部署原型设计.当特定类加载器的类路径发生更改(即已添加,删除,更新了jar)时,旧的类加载器将被丢弃(未引用),并为新的jar类路径创建新的类加载器.

更新类路径,触发热部署后,我们进行了堆转储.堆转储(使用Memory Analyzer)表明旧的类加载器没有被垃圾回收.父类加载器中的某些类正在缓存旧的类加载器.调用以下内容来清除这些缓存:

java.lang.ResourceBundle.clearCache(classLoader);
org.apache.commons.logging.LogFactory.release(classLoader);
java.beans.Introspector.flushCaches();
Run Code Online (Sandbox Code Playgroud)

即使在清除了上述缓存之后,旧的类加载器仍然没有被垃圾收集.对类加载器的其余引用包括以下内容:

  • 类加载器加载的类
  • java.lang.Package由类加载器本身创建
  • java.lang.ProtectionDomain由类加载器本身创建

以上所有都是类加载器中的循环引用,它应该触发垃圾回收.我不确定为什么不是.有没有人知道为什么旧的类加载器仍然没有被垃圾收集,即使有循环引用?

java garbage-collection memory-leaks classloader

43
推荐指数
1
解决办法
1万
查看次数