为什么Java ClassLoader没有unloadClass(String name)方法

4
正如在这篇文章中所提到的,当它们的ClassLoader被垃圾回收时,类将会被卸载。OSGI利用此功能实现了热部署。
但为什么JDK不提供unloadClass(String name)方法来帮助我们删除指定的类呢?毕竟,他们已经提供了loadClass(String name)方法。
是否有困难或副作用来提供此功能?

3
有一个loadClass方法的存在并不意味着应该有一个unloadClass方法。Java也有一个new运算符,但没有delete运算符。也许你能认出其中的规律... - Holger
@Holger 我认为提供这个功能可能会有一些困难或副作用。 - Javdroider
2
如果在类加载器仍然可达的情况下支持卸载类,那么下一次尝试加载该类将暗示类初始化程序的潜在副作用。此外,不能保证初始化程序将评估为与之前相同的类状态。但更重要的是,当您调用unload(classXYZ)并且仍然存在classXYZ的实例或子类时,应该发生什么? - Holger
因为Java使用垃圾回收机制,所以unloadClass()方法会存在安全隐患。 - user207421
2个回答

1
但为什么JDK不提供unloadClass(String name)方法来帮助我们删除指定的类呢?既然他们已经提供了loadClass(String name)。
加载类是一种非常常见的操作,几乎总是需要在创建类加载器之后(显式或后台)执行。卸载类是一种非常专业的操作,只有在极少数情况下才会看到好处,并且伴随着复杂和困难。
提供这个功能是否存在困难或副作用?
绝对存在,这类似于随机删除对象。如果您已经加载了该类,则可能会使用它,并且它的实例可能正在程序中使用。在这种情况下,当卸载类时,您希望发生什么?

1

为什么JDK不提供一个unloadClass(String name)方法来帮助我们删除指定的类?

这个问题可以回答Java的核心理念之一。Java是为了让用户不必处理内存管理而制作的。当您说卸载类时,实际上意味着您正在删除对该类的引用并从存储有关类的数据的方法区/类区中释放内存。

提供此功能是否存在任何困难或副作用?

最重要的副作用是用户可能会干扰跨所有线程共享的方法区,本身并不总是线程安全。

有关更详细的jvm理解,可以参考下面的链接:

http://blog.jamesdbloom.com/JVMInternals.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接