2013-11-23 239 views
0

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

+0

你有用例还是这只是一个普遍的问题? –

+0

如果您完全控制环境,请使用单独的类加载器来加载该类或JAR,然后卸载类加载器(可能包括对System.gc();')的调用请参见http:// stackoverflow。com/questions/148681 /卸载在java中的类 –

+0

我目前有问题试图让类正常卸载,并希望强制卸载上述类的方式。编辑:刚刚看到菲利普的答案。我有一种感觉,我将不得不使用自定义类加载器或某种类型。如果可能的话,我仍然希望回答这个问题,并说明是否显然不可能。 – Cirno

回答

1

但是,我一直想知道是否可以这样做,通过使用不安全类和手动清空类对象的地址,从而理论上“卸载”类。

这是非常不可能的,你可以找到加载类的状态被引用的所有地方。如果你没有找到它们,垃圾收集器不会认为它是不可达的,卸载不会被触发。如果你(以某种方式)使用Unsafe来粉碎(仍然)可到达的类的状态,那么最终的结果很可能是硬件JVM崩溃。

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

前者很可能。


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

据我所知,

号总之,不要尝试这样做。它的概率“工作”是微乎其微......


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

目前我有问题试图让班正常卸载和

希望强制卸载上述类的方法。

应该要做的是弄清楚是什么阻止类卸载。根本原因很可能是您仍然在某处引用了到类加载器定义的某个对象或类。消除这些引用,并且类应该卸载。 (从概念上讲,类和它的所有实例之间有一个硬的,双向的“引用”,以及类加载器和它定义的所有类之间的硬性双向“引用”,只有一个外部链接到实例或类或类加载器)足以禁止整个网络对象的gcing/unloading。)

相关问题