JVMによる静的初期化


8

言語: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初期化中に起こり得る循環依存を回避します。」


良い質問!これは、開始することができます:en.wikipedia.org/wiki/Constant_folding しかし、私は、「VMの初期化中に循環依存関係」については考えています。
Alex 75

@Alex 75私の考えでは、「静的な最終ブールCOMPACT_STRINGS = true」のように記述されている場合。「COMPACT_STRINGS」には決定された値が指定されているため、循環依存が発生する可能性を回避できます。しかし、静的に折りたたみ可能にすることは避けられませんでした。
Xiu

回答:


7

これは、JVM実装者向けの実装ノートです。これは公開ドキュメントの一部ではなく、を使用する開発者には関係ありませんjava.lang.String

しかし、知りたい場合:

彼らが書いたと想像してください:

static final boolean COMPACT_STRINGS = true;

次に、コンパイラがそれを使用されたtrue場所の値に置き換えることができる定数COMPACT_STRINGSでした(java.langパッケージローカルスコープ変数であるため、パッケージ内のみ)

true静的初期化子で値を与えることにより、コンパイラーはそれが定数であることを知らなくなり、それを使用するすべてのコードは実行時に持っている実際の値を検索する必要があります。

この場合、JVMは実行時にこの値を変更するので便利です(たとえそうであってもfinal、JVMはそれを変更できます)。


even though it's final, the JVM can still change itJVMがそれを変更できる理由について説明できますか?JVMが定数変数を変更する方法について混乱しました。
フランシスは

1
@Francisaskquestionそれを最終的にするのはJVMであり、アプリケーションに設定したルールに違反する可能性があります。
user207421

@ user207421ああ、JVMに関する知識があれば、他の変数も変更できますか?
フランシスは質問を

1
JVMはそれを行うことができます。現在のJVMで機能するリフレクションや安全でないアクセスを使用して、アプリケーションで実行できるトリックがあるかもしれませんが、これらは将来のバージョンのJVMでは機能しなくなる可能性があります(おそらくOracleの方向性を考慮するでしょう)。
Erwin Bolwidt

1
@Francisaskquestion JVMは好きなように実行できます。
user207421
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.