Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法使用sun.misc.Unsafe类强制卸载类?_Java_Memory Address - Fatal编程技术网

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

Java 有没有办法使用sun.misc.Unsafe类强制卸载类?,java,memory-address,Java,Memory Address,有点傻的问题。我已经环顾四周,发现除非编写自定义JVM,否则无法强制卸载类。然而,我一直在想,是否可以通过使用不安全的类并手动清空类对象的地址来实现这一点,从而从理论上“卸载”类。但是,我确实预测,当具有所述类的对象仍在内存中时,会出现问题,因此会立即使JVM崩溃,或者将对象的类默认为Object.class或null 然而,我一直在想,是否可以通过使用不安全的类并手动清空类对象的地址来实现这一点,从而从理论上“卸载”类 您不太可能找到引用已加载类状态的所有位置。如果没有全部找到,垃圾收集器就不

有点傻的问题。我已经环顾四周,发现除非编写自定义JVM,否则无法强制卸载类。然而,我一直在想,是否可以通过使用不安全的类并手动清空类对象的地址来实现这一点,从而从理论上“卸载”类。但是,我确实预测,当具有所述类的对象仍在内存中时,会出现问题,因此会立即使JVM崩溃,或者将对象的类默认为Object.class或null

然而,我一直在想,是否可以通过使用不安全的类并手动清空类对象的地址来实现这一点,从而从理论上“卸载”类

您不太可能找到引用已加载类状态的所有位置。如果没有全部找到,垃圾收集器就不会认为无法访问,也不会触发卸载。如果您(不知何故)使用了
Unsafe
来破坏(仍然)可访问类的状态,那么最终结果很可能是一个硬JVM崩溃

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

很可能是前者


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

阿福,不

简而言之,不要尝试这样做。它“起作用”的可能性非常小


显然你的动机是


我目前在试图让类正确卸载时遇到问题,并且希望找到一种强制卸载所述类的方法

您应该做的是找出阻止类卸载的原因。根本原因很可能是您仍然在某个地方引用了类加载器定义的某个对象或类。删除这些引用,类应该卸载


(从概念上讲,在类和它的所有实例之间有一个硬的、双向的“引用”,也有一个硬的、双向的“引用”在类加载器和它定义的所有类之间。只需一个指向实例或类或类加载器的外部链接,就足以禁止对整个对象网络进行gc'ing/卸载。)

您是否有用例,或者这只是一个一般性问题?如果您完全控制环境,使用单独的类加载器加载该类或JAR,然后卸载该类加载器(可能包括调用
System.gc();
),请参阅我目前在尝试正确卸载类时遇到问题,并希望找到一种强制卸载所述类的方法。编辑:刚刚看到菲利普的答案。我有一种感觉,我必须使用一个自定义类加载器或某种类型的加载器。如果可能的话,我仍然希望这个问题得到回答,宣布这是否完全不可能。