Java中的类销毁

28 浏览
0 Comments

Java中的类销毁

我知道Java的垃圾收集器可以清理无用的类实例,但类本身呢?我指的是类的静态字段。\n我知道在类初始化过程中,静态字段会被初始化,但是在此之后,有没有办法将它们删除?

0
0 Comments

在Java中,当一个类的ClassLoader被垃圾回收时,这个类也会被垃圾回收。

在这之后,如果重新加载这个类,静态字段会被重新初始化。

可以通过使用URLClassloader来轻松测试这一点。

需要注意的是,从jdk 7+开始,即使是在类中定义的String字面量(进入字符串常量池)也会被垃圾回收,如果该类的ClassLoader被垃圾回收。

测试代码:static final Object x = new Object() {{ System.out.println("Good Morning, Groundhog" }};

当一个类的ClassLoader被垃圾回收时,该类也会被垃圾回收。这是因为ClassLoader负责加载类的字节码并创建相应的Class对象。当ClassLoader被垃圾回收时,Class对象也会被垃圾回收。

在重新加载类时,静态字段会被重新初始化。这是因为静态字段是与类相关联的,而不是与实例相关联的。当类被重新加载时,静态字段会被重新初始化为其初始值。

从jdk 7+开始,即使是在类中定义的String字面量(进入字符串常量池)也会被垃圾回收,如果该类的ClassLoader被垃圾回收。这是因为String字面量定义在类的常量池中,而类的常量池是由ClassLoader加载和管理的。当ClassLoader被垃圾回收时,类的常量池也会被垃圾回收,导致String字面量被释放。

为了测试这种情况,可以使用URLClassloader来加载一个类。URLClassloader可以加载指定路径下的类文件,并创建相应的ClassLoader和Class对象。通过在加载的类中定义静态字段或String字面量,并在其初始化时输出一条消息,可以观察到ClassLoader被垃圾回收后,类被重新加载并重新初始化静态字段的过程。

总结起来,当一个类的ClassLoader被垃圾回收时,这个类也会被垃圾回收。重新加载类时,静态字段会被重新初始化。在jdk 7+中,String字面量也会被垃圾回收,如果其所属类的ClassLoader被垃圾回收。

0