[英]final static vs final non-static fields and JVM optimization
我很好奇JVM如何處理static
final
字段。 我在這里看到了類似的問題,但這不是我想要的。 讓我們考慮這樣的例子:
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
字段中,由於它們是final
且無法修改,因此在TestClassX
類的所有實例中具有相同的值。 當然我不能編寫TestClassX.CODE_A
但我可以說,這些值實際上對所有實例都是通用的 - 我敢肯定,每個實例都有一個值為132
的CODE_A
字段。
在TestClassY
我可以使用語法TestClassY.CODE_A
,但初看起來,對於看到“哦,這些值對於所有實例都很常見”的開發人員來說,它更容易。
我的主要問題:我猜JVM,在TestClassX
情況下,每次創建新實例時都不會為final
字段使用任何額外的內存。 可以? JVM是否在這種情況下進行任何優化以及它是什么樣的優化?
額外的問題1)我也確信我錯過了一些非常重要的東西,這是我懷疑的原因。 那是什么?
額外的問題2)順便說一句。 如何在JVM優化之后查看我的Java源代碼的樣子(以便將來可以使用;))? 有沒有IDE支持這樣的功能? 例如IntelliJ? 我想簡單地看看JVM如何處理我的TestClassX
和TestClassY
。
-XX:+TrustFinalNonStaticFields
(默認情況下為off),它告訴JVM優化對這些字段的訪問,即將它們視為常量並消除字段負載。 -XX:+PrintAssembly
VM選項來轉儲JIT編譯的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.