如果一个类被卸载并再次加载,静态块会被调用两次吗?

时间:2015-10-02 05:50:55

标签: java

如果我有一个类似下面的java类

public class XXX {
  static {
  ...
  ...
  }
}

如果JVM(由于Permgen触发的GC)卸载了类并稍后再加载它,静态块会被调用两次吗?

4 个答案:

答案 0 :(得分:2)

引用其他帖子:https://stackoverflow.com/a/148707/641955

  

可以卸载类的唯一方法是使用的Classloader是垃圾回收。这意味着,对每个类和类加载器本身的引用都需要采用渡渡鸟的方式。

如果那是你正在做的事情,那么是的,静态块将在程序的生命周期内执行两次,每次都在每个类加载器的生命周期内执行一次。

答案 1 :(得分:0)

是。您还可以使用不同的类加载器多次加载类,并为每个加载调用静态块。

答案 2 :(得分:0)

当JVM加载一个类时,由于这个原因它保持加载并且类定义保存在PermGen内存池中。

然而,课程有可能。由多个类加载器加载的字节码,每次发生这种情况时,静态块将再次执行,因为这是一个新类。每个类仅在其自己的类加载器范围内可见。

  

如果JVM(由于Permgen触发的GC)卸载了   类和稍后再加载它,将静态块调用两次   ?

是的,应该。

答案 3 :(得分:0)

每个ClassLoader只执行一次静态初始化程序。

有关排气的说明请查看JLS 12.4.2部分
“类或接口类型T将在第一次出现之前立即初始化:”

T is a class and an instance of T is created.

T is a class and a static method declared by T is invoked.

A static field declared by T is assigned.

A static field declared by T is used and the field is not a constant variable (§4.12.4).

T is a top level class (§7.6), and an assert statement (§14.10) lexically nested 
within T (§8.1.3) is executed.