JVM神祕的AllocatePrefetch選項:它們實際上是做什麼的?- opsian

banq發表於2020-02-06

AllocatePrefetch是JVM的分配預取選項。所有Java垃圾收集器都使用稱為緩衝分配的技術,通過將所需的分配大小新增到當前分配指標(緩衝位),並檢查該分配大小是否超出了分配指標指向的區域限制,以此來執行分配。

在並行執行緒分配的環境中執行時,這會帶來一種複雜性。簡單地讓所有執行緒競爭使用諸如Fetch-And-Add或Compare-And-Swap之類的原子指令來分配指標將非常低效。Java垃圾收集器使用的解決此問題的方法是執行緒本地分配緩衝區(TLAB)。

TLAB是一個能夠處理許多分配的緩衝區,並由執行緒擁有。執行緒向垃圾收集器的分配器請求這些緩衝區,然後使用它們將新物件分配到其中。由於緩衝區是執行緒本地的,並且緩衝區內的分配是單執行緒的,因此可以使用快速緩衝分配方法。JVM動態選擇TLAB的大小,將較小的TLAB分配給分配很少的執行緒,將較大的TLAB分配給分配更頻繁的執行緒。

現在您瞭解了分配的工作原理,預取從何而來?要了解預取,您首先需要了解一些有關CPU快取的組織方式。為了保持一致的記憶體檢視,所有快取都位於匯流排上,並遵守快取一致性協議。該協議使快取記憶體可以共享資料。

在理想情況下,使用AllocatePrefetch選項,分配完全適合快取記憶體行的物件時,分配效能提高了近40%。在這裡,預取可確保新分配的記憶體位於快取之一中,並允許儲存緩衝區更快地耗盡。

如果生產環節的效能瓶頸涉及非常緊密的迴圈中的大量分配,則可能應該採取這種選項。接下來,確定要執行的物件分配的型別-它們的大小和相對頻率。選擇分配預取設定,以確保最頻繁分配的物件被完全預取。最後,在生產環境中對照現有版本測試新版本。使用指標來確定效能是否有所提高。

點選標題見原文

相關文章