你應該預熱哪些部分的代碼?
通常,你不必做任何事情。但是對於低延遲應用,您應該預熱系統中的關鍵路徑。你應該有單元測試,所以我建議你在啓動時運行這些代碼來加熱代碼。
即使您的代碼被預熱,也必須確保CPU緩存保持溫暖。在阻止操作之後,您可以看到顯着的性能下降,例如,網絡IO,長達50微秒。通常情況下這不是問題,但是如果你在大多數情況下試圖保持在50微秒以下,這在大多數情況下都會成爲問題。
注意:預熱可以允許Escape Analysis踢入並將一些物體放置在堆棧上。這意味着這些對象不需要進行優化。在優化代碼之前,最好記住您的應用程序的配置文件。
即使我對代碼的某些部分進行了預熱,它會保持多長時間(假設這個術語僅表示類對象保留在內存中的時間)?
沒有時間限制。這取決於JIt是否檢測到優化代碼時所做的假設是否不正確。
如果我每次收到事件時都需要創建對象,它有什麼用處?
如果您想要低延遲或高性能,您應該創建儘可能少的對象。我的目標是生產速度低於300 KB /秒。有了這個分配率,您可以擁有足夠大的伊甸園空間,每天輕微收集一次。
考慮一個應用程序的例子,期望通過套接字接收消息,並且事務可以是新訂單,修改訂單和取消訂單或確認的交易。
我建議你儘可能重複使用對象,但如果它在你的分配預算之下,它可能不值得擔心。
請注意,該應用程序是關於高頻交易(HFT),因此性能非常重要。
您可能對我們的開源軟件感興趣,該軟件用於不同投資銀行和對衝基金的HFT系統。
http://chronicle.software/
我的生產應用程序用於高頻交易和延時的每一位可能是一個問題。這很明顯,在啓動時如果你沒有對應用程序進行熱身,它會導致幾毫秒的高延遲。
特別是您可能對https://github.com/OpenHFT/Java-Thread-Affinity感興趣,因爲此庫可以幫助減少關鍵線程中的調度抖動。
而且據說需要預熱的代碼的關鍵部分應該以最少12K次的時間運行(使用假消息),以便以最佳方式工作。爲什麼以及它如何工作?
代碼是使用後臺線程編譯的。這意味着即使某個方法可能符合編譯爲本地代碼的條件,這並不意味着它在編譯器已經非常繁忙時啓動時尤其如此。 12K並非不合理,但可能會更高。
您可能會發現用於跟蹤編譯行爲的'-XX:+ PrintCompilation'。您也可能想聯繫oracle,他們正在開發AOT編譯器,目前僅向商業客戶提供AIUI。我認爲其他一些JVM供應商也提供AOT。 – the8472
另請參閱以下鏈接:[Windows上的jvm選項](http://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html),[Linux,Solaris,Mac上的jvm選項] (http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html) –