Sono curioso di sapere come vengono gestiti i campi static
final
da JVM. Ho visto una domanda simile here ma non è quello che sto cercando. Consideriamo ad esempio:finale statico rispetto ai campi non statici finali e ottimizzazione 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
}
In TestClassX
campi, in quanto sono final
e non possono essere modificati, hanno gli stessi valori in tutte le istanze della classe TestClassX
. Naturalmente non posso scrivere TestClassX.CODE_A
ma posso dire che questi valori sono in realtà comuni per tutte le istanze - sono sicuro che ogni istanza ha un campo CODE_A
con il valore 132
.
Nel TestClassY
Posso usare la sintassi TestClassY.CODE_A
, ma a prima vista è solo più semplice per uno sviluppatore che vede "Oh, quei valori sono comuni a tutte le istanze".
La mia domanda principale: Credo che JVM, in caso di TestClassX
, non utilizza alcuna memoria aggiuntiva per final
campi ogni volta che viene creata una nuova istanza. Lo fa? JVM fa qualche ottimizzazione in questo caso e che tipo di ottimizzazione è?
Extra domanda 1) Sono anche sicuro che mi manca qualcosa di molto importante qui che è la causa dei miei dubbi. Cos'è quello?
Extra domanda 2) Btw. Come posso vedere come appare il mio codice sorgente Java dopo l'ottimizzazione JVM (quindi posso usarlo in futuro;))? Qualche IDE supporta tale funzionalità? IntelliJ per esempio? Vorrei semplicemente vedere come JVM tratta il mio TestClassX
e TestClassY
.
correlate - javac inlines sempre variabili di istanza costante, probabilmente un bug :) - https://groups.google.com/forum/#!topic/java-lang-fans/AyS3UqX4lj4 – ZhongYu
2) ottimizzazioni del JVM aren fatto in un modo che si presta ad essere espresso come sorgente Java. I compilatori ottimizzano una rappresentazione interna di ciò che il codice * fa *.source-> source optimizer di solito esiste solo per le lingue che devono essere compilate ogni volta che vengono utilizzate (ad esempio javascript). Il tuo obiettivo attuale dovrebbe essere coperto osservando il codice byte Java o l'asm derivante dalla compilazione JIT per una CPU specifica. (O tradizionale compilazione anticipata per le implementazioni Java come gcj'.) –