2017-04-18 63 views
1

我主要使用Java來編寫寵物項目,這些項目在大多數時間都處於閒置狀態。閒置數小時/天后,響應時間增加至秒(最多10秒),然後緩慢降至200-300毫秒。JVM閒置後JIT去優化

據我所知,這是因爲JIT deoptimization(優化的代碼被標記爲殭屍,刪除並稍後編譯)發生的。

除非代碼緩存已滿,否則有什麼辦法可以禁止JVM去優化代碼嗎? Java 9的AOT看起來像是這種情況下的最佳解決方案,但是我仍然沒有設法使其工作。

UPD:與往常一樣,正確的解決方案是顯而易見的解決方案。看起來問題實際上是由交換引起的。儘管有12 GB的內存,其中6個是免費的,但是在一段時間後,每個JVM的內存大約有100 MB被換成硬盤。

儘管@ apangin的答案可能對遇到相同情況的其他人有用,所以我在此留下此問題。謝謝大家!

+0

你怎麼知道***去優化是罪魁禍首? –

+0

我不知道,我只假設。這發生在多個不同的項目上,其中一些非常簡單,並且不使用Oracle和OpenJdk(x64)上的任何數據庫或緩存(電報機器人)。 –

+0

試過性能分析?你有沒有仔細看看那些寵物的記憶體消耗? – GhostCat

回答

0

-XX:-UseCodeCacheFlushing完全禁用清掃編譯方法。

雖然這對給定問題的答案,我非常懷疑這將解決您的原始問題。

當應用程序空閒時,NMethod清掃器也處於空閒狀態。 JIT編譯也不太可能是,所以的速度很慢,在重新編譯熱代碼之前需要幾十秒的時間。刷新的文件緩存,陳舊的網絡連接等更可能是這種速度下降的原因。

+0

謝謝你的回答。看起來你是對的,我的假設相當不成熟。我會嘗試檢查其他假設,並且可能會返回更多數據。 –