簡體   English   中英

Java JIT編譯器優化-在可變變量值緩存方面JIT是否一致?

[英]Java JIT compiler optimizations - is JIT consistent in respect to volatile variables value caching?

我試圖更好地了解有關可變變量值緩存的JIT編譯器如何為Java工作。 考慮以下問題中給出的示例: 帶while循環和線程的無限循環問題

boolean loaded = false; // not volatile!!!
private boolean loadAsset() {
    new Thread(new Runnable() {

        @Override
        public void run() {

            // Do something
            loaded = true;

        }
    }).start();

    while (!loaded) {
        System.out.println("Not Loaded");
    }
    System.out.println("Loaded");
    return false;
}

由於未將加載的變量聲明為volatile,因此允許 JIT編譯器在注冊表中“緩存”該變量。 據說這在理論上可能會導致無限循環,因為執行循環的線程可能在某個時間點看不到該變量是從另一個線程更新的。

但是“允許”緩存的確切含義是什么? 變量是否有時會被緩存,這意味着如果我在同一JVM中運行同一段代碼(不關閉JVM)一百萬次,則JIT編譯器可能會決定緩存該變量並產生無限循環? 還是JIT編譯器是一致的,這意味着它將決定是否緩存變量,並且該決定將在JVM的整個生命周期中對這段代碼的所有百萬次執行都不起作用?

此處的緩存發生在硬件級別,在該級別,CPU可能決定從其緩存中讀取變量的值,從而丟棄其他線程在其自己的緩存中寫入的內容。

但是, JIT可能會優化循環並將其變成無限循環,因為在循環內部未設置布爾標志,這與從緩存中讀取過時的值沒有必要。

此處的“ 允許緩存 ”可能解釋為,JIT不必在讀取變量時發出fence instruction

要回答您的最后一個問題,是的,在程序運行一段時間后,JIT可能會決定以這種方式優化循環。

JVM使用啟發式方法來決定何時以不同的優化級別編譯或重新編譯方法。 所討論的優化只能在特定的優化級別上進行。 JIT編譯器始終存在一定程度的可變性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM