JVM的静态初始化

Xia*_*nXu 8 java static-initialization

语言:Java
版本:12.0.2
字符串源代码如下:

 /* @implNote
 * The actual value for this field is injected by JVM. The static
 * initialization block is used to set the value here to communicate
 * that this static final field is not statically foldable, and to
 * avoid any possible circular dependency during vm initialization.
 */
static final boolean COMPACT_STRINGS;

static {
    COMPACT_STRINGS = true;
}
Run Code Online (Sandbox Code Playgroud)

如何理解这句话:“静态初始化块用于在此处设置值以传达此静态最终字段不可静态折叠,并避免在vm初始化期间出现任何可能的循环依赖性。”

Erw*_*idt 7

这是针对JVM实现者的实现说明。它不是公共文档的一部分,也不是使用的开发人员所关心的java.lang.String

但是,如果您想知道:

想象他们写了:

static final boolean COMPACT_STRINGS = true;
Run Code Online (Sandbox Code Playgroud)

这样,编译器就可以将其替换为使用true任何地方的值,这将是一个常数COMPACT_STRINGSjava.lang仅在包中,因为它是包局部范围的变量)

通过true在静态初始化器中为其赋值,编译器不再知道它是常量,并且所有使用它的代码都必须在运行时查找其实际值。

在这种情况下,这很有用,因为JVM会在运行时更改此值(即使finalJVM仍可以更改它),如实现说明中所述。