首页 > 解决方案 > JVM静态初始化

问题描述

语言: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;
}

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

标签: javastatic-initialization

解决方案


这是 JVM 实现者的实现说明。它不是公共文档的一部分,对于使用java.lang.String.

但如果你想知道:

想象他们写过:

static final boolean COMPACT_STRINGS = true;

那么它就是一个常量,编译器可以用true任何COMPACT_STRINGS使用的值替换它(仅在java.lang包中,因为它是包本地范围的变量)

通过在静态初始化程序中给它值true,编译器不再知道它是一个常量,所有使用它的代码都必须查找它在运行时具有的实际值。

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


推荐阅读