2014-01-18 241 views
1

這個問題是重複的Is it possible to change the priority of garbage Collector thread?如何更改垃圾回收線程的優先級?

這是一個古老的問題,事情可能自那時起改變了很多。也沒有說明一切。

是否可以更改GC線程優先級?我看到具有不同GC線程優先級的線程轉儲。如果我們無法改變它,那會發生什麼?另外,我知道高頻交易平臺希望保持GC線程優先級非常低,以便主線程在大多數時間運行,並且「停止世界」事件不會經常發生。

回答

1

簡短回答:線程優先級不能用於避免GC干擾應用程序線程。

龍答:

Java的線程優先級不是由JVM和底層操作系統尊重。這是一個衆所周知的問題,例如,由RTSJ。

Java線程優先級要求是:

  • 專門設計的VM支持Java的優先事項,並
  • 實時OS

如果沒有這兩個,線程優先級將僅用作提示,並且不保證優先級較低的線程不會被較低優先級的線程搶佔。

GC線程優先級是由VM在創建GC線程時設置的,不能從用戶空間修改。對於高頻率交易或避免GC停止世界暫停一般是仔細的GC調整和選擇適當的GC算法 - 這兩個都可以在一個comodity虛擬機中完成(如HotspotVM)。

2

是否可以更改GC線程優先級?

我真的認爲這是錯了的問題。您不希望影響此類關鍵後臺操作的優先級。根據線程體系結構的不同,這可能導致GC線程捱餓並導致JVM失效。

我認爲正確減少GC系統使用的CPU數量是減少您的對象帶寬 - 減少正在創建和回收的對象的數量。您應該使用內存分析器來查看系統的哪些部分消耗太多內存或使用太多臨時對象。

有許多方法來減少對象帶寬:

  • 改變使用可變對象在適當的時候(即,其中所述對象未線程之間共享)
  • 清算和重用集合,而不是重建他們
  • 使用StringBuilder而不是串行String使用SLF4J型{}記錄追加
  • 可能使用ThreadLocal存儲狀態的對象,可以重新再利用
  • 等。

有許多方法來減少你的代碼的對象帶寬,最終將會對內存性能更影響而不是使用後臺系統線程的線程優先級進行播放。

請參閱下面的@ Voo評論,對此有一個很好的警告。

+2

雖然在這方面「優化」的時候最好*非常小心。舉一個例子:短命的小對象是GC調用的東西,因此引入對象池來重用對象通常會導致現代JVM上的性能下降(特別是延遲)。年輕的GCs真的很便宜! – Voo

+0

有點贊同@Voo。我不確定使用對象池會不會導致更糟糕的性能(除非它實施得不好或需要同步鎖或其他東西),但它肯定會意味着更多的代碼,而不會改進性能。 – Gray

+0

謝謝。在那種情況下,線程轉儲中GC線程的優先級不同是因爲JVM決定爲不同的應用程序設置不同的優先級? –