JVM tarafından işlenen static
final
alanlarının nasıl olduğunu merak ediyorum. Benzer bir soru gördüm here ama aradığım şey değil. en tür örneği ele alalım:Son statik olmayan alanlar ve JVM optimizasyonu
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
}
TestClassX
yılında alanları, bunlar final
ve değiştirilemez, TestClassX
sınıfın tüm örnekleri aynı değerlere sahip olarak. Tabii ki TestClassX.CODE_A
yazamıyorum ama bu değerlerin aslında tüm örnekler için yaygın olduğunu söyleyebilirim - eminim ki, her örnekte 132
değerine sahip CODE_A
alanı var.
TestClassY
TestClassY.CODE_A
sözdizimini kullanabilirim, ancak ilk bakışta "Oh, bu değerler tüm örneklerde yaygındır" gören bir geliştirici için daha kolaydır.
Benim asıl soru: Ben JVM, TestClassX
durumunda, final
alanlar yeni bir örneği her oluşturulduğunda için herhangi bir ekstra bellek kullanmaz tahmin. Yapar? JVM bu durumda herhangi bir optimizasyon yapar mı ve ne tür bir optimizasyon?
Ekstra soru 1) Ayrıca şüphelerimin sebebi olan burada çok önemli bir şeyi kaçırdığımı da biliyorum. Bu da ne?
Ekstra soru 2) Btw. JVM optimizasyonundan sonra Java kaynak kodumun nasıl göründüğüne nasıl göz atabilirim (böylece gelecekte de kullanabilirim;))? Herhangi bir IDE böyle bir işlevselliği destekliyor mu? Örneğin IntelliJ? JVM'nin TestClassX
ve TestClassY
numaramı nasıl ele aldığını görmek isterim.
ilgili - https://groups.google.com/forum/#!topic/java-lang-fans/AyS3UqX4lj4 – ZhongYu
2) JVM optimizasyonlar değiller - Javac hep :) sürekli örnek değişkenler, muhtemelen bir hata inlines kendisini, Java kaynağı olarak ifade edilmeye teşvik edecek şekilde yapılmadı. Derleyiciler, kodun * yaptıklarının dahili bir temsilini optimize ederler.source-> source optimizers genellikle, her kullanıldığında (örneğin javascript) derlenmesi gereken diller için vardır. Buradaki asıl amacınız, Java bayt koduna veya belirli bir CPU için JIT-derlemesinden kaynaklanan asm'a bakılarak ele alınmalıdır. (Ya da gcj gibi Java uygulamalarını geleneksel olarak derleyen bir zaman.) –