有没有办法通过使用sun.misc.Unsafe类强制卸载类?

时间:2013-11-23 01:44:50

标签: java memory-address

有点愚蠢的问题。我已经环顾四周,看到除非你编写了一个自定义JVM,否则无法强制卸载类。但是,我一直想知道是否可以通过使用Unsafe类并手动清空类对象的地址来实现,从而理论上“卸载”类。但是,我确实预测当具有所述类的对象仍然在内存中时会出现问题,因此要么迅速崩溃JVM,要么将对象的类默认为Object.class或null。

1 个答案:

答案 0 :(得分:1)

  

但是,我一直想知道是否可以通过使用Unsafe类并手动清空类对象的地址来实现,从而理论上“卸载”类。

您极不可能找到引用已加载类的状态的所有位置。如果您没有找到它们,垃圾收集器将不会认为它无法访问,并且不会触发卸载。如果你(以某种方式)使用Unsafe来粉碎(仍然)可访问类的状态,那么最终结果可能是一个硬JVM崩溃。

  但是,我确实预测当具有所述类的Object仍在内存中时会出现问题,因此要么立即崩溃JVM,要么将对象的类默认为Object.class或null。

前者,很有可能。


  

有没有办法强制使用sun.misc.Unsafe类卸载一个类?

AFAIK,No。

简而言之,不要试图这样做。它“工作”的可能性很小......


显然你的动机是......

  

我目前在尝试正确卸载类并且想要一种强制卸载所述类的方法时遇到问题。

应该做什么是弄清楚什么阻止了类卸载。根本原因很可能是您仍然将某处引用到类加载器定义的某个对象或类。消除这些引用,类应该卸载。

(从概念上讲,类和它的所有实例之间存在一个硬的双向“引用”,类加载器和它定义的所有类之间存在一个硬的双向“引用”。只有一个外部链接到实例或类,或类加载器,足以抑制整个对象网络的gc /卸载。)