簡體   English   中英

java虛擬機 - 它如何分配資源?

[英]java virtual machine - how does it allocate resources?

我正在測試支持連續查詢的數據流系統的性能。

這是它的工作原理: - 有一個輪詢服務,它將數據發送到我的系統。 - 當數據傳入系統時,每個查詢將根據當前時間流的窗口進行評估。 - 數據傳入時窗口滑動。

我的問題是,當我向系統添加更多查詢時,我應該預期吞吐量會降低,因為它無法應對數據速率。

但是,我實際上觀察到吞吐量的增加

我無法理解為什么會這樣,我猜這與JVM分配CPU,內存等的方式有關。

任何人都可以解決我的問題嗎?

大多數Java虛擬機最初都會插入JVM字節碼,這比本機機器代碼執行稍慢。 當JVM發現您正在重復使用代碼的特定部分時,它會將該部分代碼編譯為本機代碼(提高其處理速度)。 因此,有時壓力測試代碼,甚至使代碼運行更長時間,往往會加速執行而不是減慢速度。 HotSpot JVM(SUN的默認JVM)是​​最知名的JVM,它執行本機編譯以加速代碼執行。

此外,與您過去可能遇到的某些庫相比,許多Java庫非常成熟。 這意味着它們可能在套接字,可重新分配的工作線程的線程池或適用於高吞吐量處理的任何數量的技術上使用非阻塞偵聽器而不是分配線程來處理請求。 這與JIT(類似HotSpot)JVM的自調整相結合,使Java基准測試成為一項挑戰。 一般來說,在運行的時間越長,事情往往越快。

一如既往,答案是剖析。 但是,只是提出一個猜測:Hotspot VM在它開始做它的JIT魔術之前需要相當多的傳遞。

您的問題在技術細節上非常清楚,但這是一個猜測。

如果IO流式子系統相當有效(例如基於select )並且單個客戶端不會使網絡接口飽和,則許多客戶端的存在可能僅僅因為服務器進程可以處理更多數據而增加總吞吐量。

Java應用程序的性能,尤其是微基准測試(對一小段代碼進行基准測試)在Java中可能非常困難,因為JVM,JIT編譯器和垃圾收集器可能會對程序的性能產生巨大且難以預測的影響。

Java兼容性和性能大師Brian Goetz撰寫了一系列優秀的文章“Java理論與實踐”:

另一個笨症理論:當然,隨着負載的增加,吞吐量會增加,至少在你達到容量之前。 如果平均每秒可以處理100個查詢,並且平均每秒發送10個查詢,則每秒吞吐量為10個查詢。 如果平均將負載增加到100qps,則吞吐量(幾乎)為100qps。 當然,它會變得更糟。 你不是靠近容量嗎? 對不起,如果這是你肯定排除的。

暫無
暫無

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

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