static
final
フィールドはJVMでどのように扱われているのですか?私は同様の質問hereを見たが、それは私が探しているものではない。のは、そのような例を考えてみましょう:TestClassX
分野でfinal static vs final non-staticフィールドとJVMの最適化
public class TestClassX {
public final int CODE_A = 132;
public final int CODE_B = 948;
public final int CODE_C = 288;
// some other code
}
public class TestClassY {
public static final int CODE_A = 132;
public static final int CODE_B = 948;
public static final int CODE_C = 288;
// some other code
}
、彼らはfinal
であり、変更することはできません、TestClassX
クラスのすべてのインスタンスで同じ値を持っているよう。もちろん、私はTestClassX.CODE_A
と書くことはできませんが、これらの値は実際にはすべてのインスタンスで共通しています - 確かに、それぞれのインスタンスはフィールドの値が132
です。
では、構文TestClassY.CODE_A
を使用できますが、最初は "ああ、その値はすべてのインスタンスで共通です"と思う開発者にとっては簡単です。
私の主な質問: 私はJVMは、TestClassX
の場合には、final
フィールド新しいインスタンスが作成されるたびに、余分なメモリを使用しないことを推測します。それは?この場合、JVMは最適化を行いますが、どのような最適化ですか?
その他の質問1)私は疑問の原因である非常に重要なものを見逃していると確信しています。あれは何でしょう?
追加質問2)Btw。 JVMの最適化後のJavaソースコードの見た目を見てみるとどうなりますか?どのIDEでもこのような機能をサポートしていますか?例えばIntelliJ?私は、単にJVMが私のTestClassX
とTestClassY
をどう扱うのか見てみたいと思います。
- javacは常にバグ:)おそらく、一定のインスタンス変数をインライン化 - https://groups.google.com/forum/#!topic/java-lang-fans/AyS3UqX4lj4 – ZhongYu
2)JVMの最適化が上がりませんJavaソースとして表現することができます。コンパイラは、コード*の内部表現を最適化します*。source-> sourceオプティマイザは通常、使用するたびにコンパイルする必要がある言語(javascriptなど)にのみ存在します。ここでの実際の目標は、Javaのバイトコード、または特定のCPUのJITコンパイルに起因するasmを調べることでカバーする必要があります。 (あるいはgcj'のようなJava実装のための従来の先取りコンパイル) –