如果我有一个类似下面的java类
public class XXX {
static {
...
...
}
}
如果JVM(由于Permgen触发的GC)卸载了类并稍后再加载它,静态块会被调用两次吗?
答案 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.