Java 7 Hotspot循環(huán)Bug詳解
上周Java 7 GA發(fā)布后,新JIT默認(rèn)開(kāi)啟的優(yōu)化中發(fā)現(xiàn)了一個(gè)問(wèn)題。雖然這個(gè)問(wèn)題最早是在Lucene搜索索引器的一個(gè)用例中出現(xiàn)的,但是它也有可能普遍存在于其他代碼之中。
這個(gè)Bug引來(lái)了不少杞人憂天的文章,例如《Don't use Java 7 for anything》,其中暗示所有循環(huán)都有問(wèn)題。事實(shí)上,雖然存在一個(gè)有效的Bug(循環(huán)可能無(wú)法正確執(zhí)行或者引起SIGSEGV崩潰),但是這個(gè)Bug 從Java 6開(kāi)始就有了,如果開(kāi)啟了-XX:+OptimizeStringConcat或-XX:+AggressiveOpts優(yōu)化就會(huì)發(fā)生這個(gè)問(wèn)題。
這個(gè)問(wèn)題實(shí)際只會(huì)發(fā)生在特定的循環(huán)(循環(huán)體可能會(huì)修改循環(huán)條件)中,該問(wèn)題的補(bǔ)丁中對(duì)此做了說(shuō)明。在以-Xint(解釋模式)運(yùn)行的情況下不會(huì)發(fā)生這個(gè)問(wèn)題,但在-server模式下就會(huì)有問(wèn)題,服務(wù)器端應(yīng)用程序很有可能就會(huì)使用這種模式。
如果問(wèn)題不算太嚴(yán)重,出于此Bug帶來(lái)的公眾壓力,Java 7 Update 1中會(huì)包含該補(bǔ)丁。由于Java 7剛剛發(fā)布,目前還不會(huì)被用于生產(chǎn)環(huán)境,而且它也不是這方面發(fā)現(xiàn)的第一個(gè)問(wèn)題(Oracle在后續(xù)版本中修復(fù)了這個(gè)問(wèn)題)。與此同時(shí),問(wèn)題描述中指出可以通過(guò) -XX:-UseLoopPredicate標(biāo)志來(lái)關(guān)閉這個(gè)特定的優(yōu)化。
在Lucene和Solr項(xiàng)目中最早發(fā)現(xiàn)該問(wèn)題的Uwe Schindler詳細(xì)記錄了Bug背后的故事,包含后續(xù)的反應(yīng)(以及過(guò)激反應(yīng))。他記錄到Twitter上大家的反應(yīng)和后續(xù)的文章將Bug的優(yōu)先級(jí)提高了,它的補(bǔ)丁將被放在Java 7 Update 1中,而不是Java 7 Update 2。但是,他也說(shuō)了,盡管高優(yōu)先級(jí)Bug(會(huì)導(dǎo)致SIGSEGV)會(huì)在Java 7 Update 1中修復(fù),但是還有兩個(gè)其他Bug仍是中優(yōu)先級(jí)。
正如Robert Muir的分析中所說(shuō)的,因?yàn)檫@些優(yōu)化都是在循環(huán)最少10,000次后才被引入的,所以很多測(cè)試都覆蓋不到。已經(jīng)有了補(bǔ)丁,會(huì)納入以后的Java 7更新中,禁用LoopPredicate優(yōu)化也能讓Java 7擺脫這些問(wèn)題。
【編輯推薦】
- 別用Java 7?你是在開(kāi)玩笑嗎?
- 小心bug!慎用Java 7
- NetBeans新版發(fā)布,全面支持JDK 7
- Java 7正式發(fā)布
- Oracle推出最新Java SE 7版