我有一个定义类装载因此,桌面应用程序可以动态开始装载的课程从一个应用服务器,我需要谈谈。我们这样做是因为数额的罐子就是需要这样做是可笑的(如果我们想给船)。我们还有版本的问题,如果我们不负荷类动态在运行时间从应用服务器库。

现在,我只是打一个问题我需要谈谈两个不同的AppServers并发现,根据其类我载的第一个我可能会打破严重...是否有任何方式迫使卸类没有实际上杀死JVM?

希望这是有意义的

有帮助吗?

解决方案

可以卸载类的唯一方法是使用的Classloader是垃圾回收。这意味着,对每个类和类加载器本身的引用都需要采用渡渡鸟的方式。

您的问题的一个可能的解决方案是为每个jar文件提供一个Classloader,并为每个AppServer提供一个Classloader,它将类的实际加载委托给特定的Jar类加载器。这样,您可以为每个App服务器指向不同版本的jar文件。

但这不是微不足道的。 OSGi平台努力做到这一点,因为每个bundle都有不同的类加载器,并且平台解决了依赖关系。也许一个好的解决方案就是看看它。

如果您不想使用OSGI,一种可能的实现可能是使用 JarClassloader 类。

创建一个扩展Classloader的新的MultiClassloader类。此类内部将具有JarClassloaders的数组(或List),并且在defineClass()方法中将遍历所有内部类加载器,直到找到定义或抛出NoClassDefFoundException。可以提供几种访问器方法来向类中添加新的JarClassloaders。对于MultiClassLoader,网上有几种可能的实现方式,因此您甚至可能不需要编写自己的实现。

如果为服务器的每个连接实例化MultiClassloader,原则上每个服务器可能使用同一类的不同版本。

我在一个项目中使用了MultiClassloader的想法,其中包含用户定义脚本的类必须从内存中加载和卸载,并且它运行良好。

其他提示

是有办法的负荷类和"卸载"后他们。关键是要实现自己的这类装入器的驻留之间的高级别类装载机(本系统类装载机)和类机应用程序服务器(s),并希望该应用程序服务器的类机做委托类加载到上装载机。

一类是由其定义包,其名称和类装载它最初装载。计划一个"代理"类装入器,这是第一个装载时开始JVM。工作流程:

  • 程序开始和真正的"主要"类载入通过这个代理类装入器。
  • 每个类,然后是通常载入(即不通过另一类装入器实施这可能打破的层次结构)将委托给这类程序。
  • 这类装入器代理代表 java.xsun.x 该系统类装入器(这些 必须不 被载入通过的任何其他类加载于该系统的类装载器).
  • 对于每一类,是可替换的,一个实例类装入器(其真负荷类并不代表它到父类装入器)和负载过这一点。
  • 存储包/名称之类的关键和类装入器作为价值观的数据结构(即哈希).
  • 每一个时代理类装入器获取请求为一个类,装载之前,返回的流离舱装载机存储。
  • 这应该足以定位字节的数组一级通过类装载机(或"删除"键值对从你的数据结构)和重新装载这类情况下,你想要改变它。

做不来的 ClassCastExceptionLinkageError 等等。

更详细的信息有关的类层次的加载程序(是的,这正是你正在实施在这里-)看 "基于服务器的Java程",由Ted Neward -那本书对我帮助实现非常类似的东西你想要什么。

我编写了一个自定义类加载器,从中可以卸载单个类而无需GCing类加载器。 Jar类加载器

类加载器可能是一个棘手的问题。如果您使用多个类加载器并且没有明确和严格定义其交互,则尤其会遇到问题。我认为为了实际上能够卸载一个类,你必须删除对你试图卸载的任何类(及其实例)的所有引用。

大多数需要做此类事情的人最终都使用 OSGi 。 OSGi功能强大,重量轻,易于使用,

您可以卸载ClassLoader,但无法卸载特定的类。更具体地说,您无法卸载在不受您控制的ClassLoader中创建的类。

如果可能,我建议您使用自己的ClassLoader,以便卸载。

类具有对其ClassLoader实例的隐式强引用,反之亦然。它们像Java对象一样被垃圾收集。如果没有访问工具界面或类似工具,则无法删除单个类。

一如既往,您可以获得内存泄漏。对你的某个类或类加载器的任何强引用都会泄露整个事情。例如,在ThreadLocal,java.sql.DriverManager和java.beans的Sun实现中会出现这种情况。

如果您正在观看卸载课程是否在 JConsole 或其他东西,尝试在类卸载逻辑的末尾添加 java.lang.System.gc()。它明确地触发了垃圾收集器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top