簡體   English   中英

如果一個帶有 while-true 循環的方法只被調用一次,它會在線程的剩余生命周期內留在解釋器中嗎?

[英]if a Method with a while-true loop gets invoked only once, it will stay in the interpreter for the remaining lifetime of it's thread?

我有這樣的擔憂:如果一個方法包含一個 while-true 循環,它只被調用一次並被解釋,那么它將永遠在解釋器中執行並降低性能。 當我測試名為 libminecraft 1.14.4 native next generation 的 AOT 編譯 Minecraft 版本時,我首先懷疑這一點。 我使用 OpenJDK 13 + JVMCI 並看到更好的峰值性能。 我完全理解 Minecraft 在多線程上運行了很多 while-true 循環,所以當我使用 inline-then-optimize Whole-Program Optimization 運行另一個測試時,它給出了非常糟糕的性能,除非 AOT-Compiled(非優化版本在使用完全相同的 OpenJDK 版本的非 AOT 測試中表現良好)。 如果一個帶有 while-true 循環的方法只被調用一次,它會在線程的剩余生命周期中停留在解釋器中,這實際上是真的嗎? 我不能用 -XX:+PrintCompilation 來運行像 Minecraft 這樣大的東西。

具有長時間運行循環的方法也可以進行 JIT 編譯。

HotSpot JVM 有一種稱為堆棧替換的技術:

也稱為“OSR”。 將解釋的(或優化程度較低的)堆棧幀轉換為編譯的(或優化程度更高的)堆棧幀的過程。 當解釋器發現一個方法正在循環時,就會發生這種情況,請求編譯器生成一個特殊的 nmethod,其入口點位於循環的某處(具體來說,在向后分支),並將控制權轉移到該 nmethod。

大多數編譯器功能/優化對 OSR 編譯都有效,就像對常規編譯一樣。 但是,在某些情況下( 1、2 ,OSR 存根看起來不像完全編譯的方法那樣優化。 但在實際應用程序中,長時間運行的循環不調用其他方法的情況並不常見,因此 OSR 很少成為性能問題。

作為一般的編程實踐while-true循環不是一件好事,或者最多嘗試尋找一些替代方案。

解釋器不存儲任何代碼,它只是執行字節碼,

這里的關鍵點是,只要線程條目 function 不退出/返回,線程就會一直存在。 然而,這並不一定意味着線程必須主動執行代碼。

如果你不想在中斷條件之前執行一次,那么有多種方法可以實現 while true 循環意味着你可以嘗試使用while(!<<some-condition>>)而不是while(true)

暫無
暫無

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

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