Java 类何时从堆内存卸载
可能重复:Java 类何时从堆内存卸载,java,Java,可能重复: 类何时从内存中卸载 为了加载一个类,我们可以调用class.forName(“NameOfClass”)或创建类的对象时,将该类加载到内存中。简单地说: 当删除对类(及其实例)的所有引用并对使用的类加载器进行垃圾收集时,类将被卸载。Classes 类将由类加载器加载,并且当该类加载器被垃圾收集时(可能)将被卸载。在普通应用程序中,我们不关心类加载器:类永远不会被卸载 类/对象的实例 垃圾收集器检测到不再有对该实例/对象的引用时,将在堆上创建并删除对象 (简而言之,更好的细节:请参见
类何时从内存中卸载 为了加载一个类,我们可以调用
class.forName(“NameOfClass”)代码>或创建类的对象时,将该类加载到内存中。简单地说:
当删除对类(及其实例)的所有引用并对使用的类加载器进行垃圾收集时,类将被卸载。Classes
类将由类加载器加载,并且当该类加载器被垃圾收集时(可能)将被卸载。在普通应用程序中,我们不关心类加载器:类永远不会被卸载
类/对象的实例
垃圾收集器检测到不再有对该实例/对象的引用时,将在堆上创建并删除对象
(简而言之,更好的细节:请参见问题)没有定义类将被卸载的确切时间,就像没有定义对象可能被垃圾回收的确切时间一样。定义的是何时可以卸载:
当且仅当类或接口的定义类
垃圾收集器可以回收装载器
我正要回答,但谷歌上的第一个链接是这样一个问题:你为什么需要这个?顺便说一句,这取决于JVM,可能根本无法完成(请参阅臭名昭著的PermGen问题)。不,它可能可以省略垃圾收集,但在某些情况下,该类实际上可能永远不会被收集。不正确。一个类只有在其类加载器被垃圾回收时才会被卸载。您正在回答对象/实例。同意,应该删除对类和类加载器本身的引用。@CodeBuzz-没有对类的(Java-)引用。该类是基于类文件的jvm内部数据结构。我有一种感觉,你仍然混淆了类和实例…据我所知,当一个类被加载到内存中时,一个类的实例被创建,其中包含了关于加载的类的信息。我们可以通过编写ClassName.class来获取类的实例。所以,要从内存中卸载类,该类的实例应该由垃圾收集器收集。但这里有一个要点,当垃圾收集器销毁class的对象(由于类的加载而创建)时,如果对象丢失了所有引用,则通常一个对象符合垃圾收集器的条件。那么class的对象何时以及如何丢失了所有引用JDK提供的Java类(例如Java.util.ArrayList
和Java.math.BigIntege
r)是否完全卸载了?