2016-01-22 63 views
7

從IBM:爲什麼-Xrs降低性能

-Xrs

禁用信號在JVM處理。

-Xrs

設置-Xrs防止處理任何內部或外部產生的信號,例如SIGSEGV和SIGABRT了Java運行™時環境。所有引發的信號都由默認的操作系統處理程序處理。 取決於應用程序,禁用JVM中的信號處理可將性能降低約2-4%。

-Xrs:同步

在UNIX系統上,這個選項禁用在JVM對SIGSEGV,SIGFPE,SIGBUS,SIGILL,SIGTRAP,andSIGABRT信號的信號處理。但是,JVM仍然處理SIGQUIT和SIGTERM信號等。與-Xrs一樣,使用-Xrs:同步會將性能降低約2-4%,具體取決於應用。

注:設置此選項可防止由JVM對信號如SIGSEGV和SIGABRT產生轉儲,因爲JVM不再截取這些信號。

https://www-01.ibm.com/support/knowledgecenter/SSYKE2_7.0.0/com.ibm.java.aix.70.doc/diag/appendixes/cmdline/Xrs.html

從我的理解,-Xrs真的是用來防止轉儲從當某些OS的信號被截獲的產生。

由於JVM不再截獲和處理這些信號,如權利由IBM會站在原因,這會增加性能,不減少它。

爲什麼-Xrs會降低性能?

回答

8

由於safepoints和VM操作以及JIT在允許其管理信號時可以執行的其他優化。

JVM偶爾需要執行一些操作,要求它在全局中暫停執行(「停止世界」),例如某些大規模垃圾回收,熱重載或內部重新編譯類等。爲了做到這一點,它必須確保所有正在運行的線程都碰到障礙並同時暫停,執行操作,然後釋放線程。

HotSpot(可能是其他JVM)用來實現安全點的一種技巧是巧妙地濫用segfaults:它設置了一個實際上不用於任何數據的內存頁面,然後每個線程都會定期嘗試讀取頁。當不需要VM操作時,讀取成功的開銷非常低,並且線程只是保持運行。

當JVM 確實需要執行VM操作時,它會使該內存頁無效。The next time each thread hits a safepoint, it now causes a segfault,它讓JVM重新獲得該線程執行的控制權;它一直持續到虛擬機操作完成,重新設置標記頁面,並重新啓動所有線程。

當您禁用SIGSEGV處理時,JVM必須使用其他技術來同步比委託給處理器的內置內存保護效率低的安全點。

此外,JVM在分析時會執行一些嚴重的魔法(基本上類似於CPU的分支預測器)。它使用的優化之一是,如果它檢測到某個空值檢查幾乎從不爲空,它會忽略該檢查並依靠段錯誤(代價很高,但在這種情況下很少)來捕獲空值。此優化還需要自定義處理SIGSEGV。

+0

順便說一句,安全點輪詢的影響通常不是那麼大。信號處理程序也用於隱式空值檢查,用於堆棧溢出檢查(aka * stack banging *),用於本機方法調用的遠程內存屏障,用於快速JNI_GetField,用於隱式處理整數除法邊界情況以及其他一些優化。 – apangin

+0

@apangin我知道JVM使用其他操作的技巧,但我不熟悉它們。我鼓勵你寫一個描述他們的答案。 (如果存在不準確性,請進行編輯;我的記憶是HotSpot做了測試,但沒有寫入數據。) – chrylis

+0

您說得對,HotSpot在x86上進行'測試'以進行安全點輪詢。對不起,我把這與堆棧撞擊混淆了。我認爲所有這些JVM技巧都值得特別關注。希望很快寫出來。 – apangin

5

除了@chrylis提到的safepoints,segfault處理程序也用於其他聰明的優化技巧,如隱式空指針檢查(至少它們在熱點上)。如果配置文件顯示很少觸發空檢查代碼路徑,那麼它會被優化,而不太可能的情況會被信號處理程序覆蓋。

如果不安裝自定義信號處理程序,則無法執行此類優化。