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

时间:2018-04-27 05:48:28

标签: java jvm

正如this post中所介绍的那样,当ClassLoader被垃圾收集时,类会被上传,OSGI会用它来实现热解码。
但是为什么JDK不提供unloadClass(String name)方法来帮助我们删除一个sepecify类?因为他们提供了loadClass(String name)
提供此功能有任何困难或副作用吗?

2 个答案:

答案 0 :(得分:1)

  

但为什么JDK不提供unloadClass(String name)方法来帮助我们删除一个sepecify类?因为他们提供了loadClass(String name)

加载类是一个非常常见的操作,几乎总是需要在创建类加载器后(显式或在后台)执行。 卸载类是一种非常专业的操作,只能在一小部分用例中看到好处,并且会带来并发症和困难。

  

提供此功能有任何困难或副作用吗?

当然,它类似于随机删除一个对象。如果您已加载该类,则可能会使用该类,并且可能正在您的程序中使用它的实例。在卸载类时,您希望在这种情况下发生什么?

答案 1 :(得分:1)

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

这个问题可以解释为java的核心哲学之一。 记住Java时,用户不必处理内存管理。 当你说卸载类时,它实质上意味着你删除对类的引用会释放存储与类相关的数据的方法区/类区域的内存。

提供此功能有任何困难或副作用吗?

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

有关jvm的更多详细信息,请参阅以下链接:

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