2015-09-11 14 views
5

staticfinalフィールドは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が私のTestClassXTestClassYをどう扱うのか見てみたいと思います。

+0

- javacは常にバグ:)おそらく、一定のインスタンス変数をインライン化 - https://groups.google.com/forum/#!topic/java-lang-fans/AyS3UqX4lj4 – ZhongYu

+0

2)JVMの最適化が上がりませんJavaソースとして表現することができます。コンパイラは、コード*の内部表現を最適化します*。source-> sourceオプティマイザは通常、使用するたびにコンパイルする必要がある言語(javascriptなど)にのみ存在します。ここでの実際の目標は、Javaのバイトコード、または特定のCPUのJITコンパイルに起因するasmを調べることでカバーする必要があります。 (あるいはgcj'のようなJava実装のための従来の先取りコンパイル) –

答えて

6
  • 非スタティックフィールドは常にインスタンスに存在します。彼らは記憶を保存しません。
  • 一般に、JVMは非静的フィールドを最適化しません。たとえ最終的なものであっても、リフレクションやデシリアライズ時に別の値に設定することができます。
  • 実験的なVMオプション-XX:+TrustFinalNonStaticFields(デフォルトではオフ)があり、JVMにそのようなフィールドへのアクセスを最適化するように指示します。つまり、それらを定数として扱い、フィールドの負荷を排除します。
  • JITコンパイル済みコードをダンプするためのVMオプションが-XX:+PrintAssemblyです。関連
+0

リフレクションとデシリアライゼーション。そして、TrustFinalNonStaticFieldsオプションのために - 私は知らなかった! ... ^ –

1

ご質問の最初の部分については、おそらくthis answerがお手伝いします。

2番目の部分については、コードを実行/コンパイルするときに-XX:+PrintOptoAssemblyフラグを追加して、生成されたアセンブリ(this answerに記載されているとおり)を確認できます。

あなたに与えられたアセンブリコードがjvmによって生成された実際のオペコードではありませんが、コードは 実際のアーキテクチャで実行する必要があります。

希望すると便利です。

+0

コメントとして投稿してくれて申し訳ありませんが、私はそういう評判を持っていません... –

関連する問題