Java 7 Hotspot循環Bug詳解

fmms 13年前發布 | 11K 次閱讀 Java7

上周Java 7 GA發布后,新JIT默認開啟的優化中發現了一個問題。雖然這個問題最早是在Lucene搜索索引器的一個用例中出現的,但是它也有可能普遍存在于其他代碼之中。

這個Bug引來了不少杞人憂天的文章,例如《Don't use Java 7 for anything》,其中暗示所有循環都有問題。事實上,雖然存在一個有效的Bug(循環可能無法正確執行或者引起SIGSEGV崩潰),但是這個Bug從Java 6開始就有了,如果開啟了-XX:+OptimizeStringConcat-XX:+AggressiveOpts優化就會發生這個問題。

這個問題實際只會發生在特定的循環(循環體可能會修改循環條件)中,該問題的補丁中對此做了說明。在以-Xint(解釋模式)運行的情況下不會發生這個問題,但在-server模式下就會有問題,服務器端應用程序很有可能就會使用這種模式。

如果問題不算太嚴重,出于此Bug帶來的公眾壓力,Java 7 Update 1中會包含該補丁。由于Java 7剛剛發布,目前還不會被用于生產環境,而且它也不是這方面發現的第一個問題(Oracle在后續版本中修復了這個問題)。與此同時,問題描述中指出可以通過 -XX:-UseLoopPredicate標志來關閉這個特定的優化。

在Lucene和Solr項目中最早發現該問題的Uwe Schindler詳細記錄了Bug背后的故事,包含后續的反應(以及過激反應)。他記錄到推ter上大家的反應和后續的文章將Bug的優先級提高了,它的補丁將被放在Java 7 Update 1中,而不是Java 7 Update 2。但是,他也說了,盡管高優先級Bug(會導致SIGSEGV)會在Java 7 Update 1中修復,但是還有兩個其他Bug仍是中優先級。

正如Robert Muir分析中所說的,因為這些優化都是在循環最少10,000次后才被引入的,所以很多測試都覆蓋不到。已經有了補丁,會納入以后的Java 7更新中,禁用LoopPredicate優化也能讓Java 7擺脫這些問題。
java.gif

查看英文原文:Java7 Hotspot Loop Bug Details
       原文鏈接

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!