Java 7 Hotspot循环Bug详解

fmms 13年前
     <p>上周Java 7 GA发布后,新JIT默认开启的优化中发现了<a href="/misc/goto?guid=4958183180778046498">一个问题</a>。虽然这个问题最早是在<a href="/misc/goto?guid=4958183181529486279">Lucene</a>搜索索引器的一个用例中出现的,但是它也有可能普遍存在于其他代码之中。</p>    <p> 这个Bug引来了不少杞人忧天的文章,例如<a href="/misc/goto?guid=4958183182267521778">《Don't use Java 7 for anything》</a>,其中暗示所有循环都有问题。事实上,虽然存在一个有效的Bug(循环可能无法正确执行或者引起SIGSEGV崩溃),但是这个Bug从Java 6开始就有了,如果开启了<code>-XX:+OptimizeStringConcat</code>或<code>-XX:+AggressiveOpts</code>优化就会发生这个问题。</p>    <p> 这个问题实际只会发生在特定的循环(循环体可能会修改循环条件)中,<a href="/misc/goto?guid=4958183182996527725">该问题的补丁</a>中对此做了说明。在以<code>-Xint</code>(解释模式)运行的情况下不会发生这个问题,但在<code>-server</code>模式下就会有问题,服务器端应用程序很有可能就会使用这种模式。</p>    <p> 如果问题不算太严重,出于此Bug带来的公众压力,Java 7 Update 1中会包含该补丁。由于Java 7刚刚发布,目前还不会被用于生产环境,而且它也不是这方面发现的<a href="/misc/goto?guid=4958183183719105635">第一个问题</a>(Oracle在后续版本中<a href="/misc/goto?guid=4958183184449906825">修复了</a>这个问题)。与此同时,<a href="/misc/goto?guid=4958183180778046498">问题描述</a>中指出可以通过<code> -XX:-UseLoopPredicate</code>标志来关闭这个特定的优化。</p>    <p> 在Lucene和Solr项目中最早发现该问题的Uwe Schindler详细记录了<a href="/misc/goto?guid=4958183185853857512">Bug背后的故事</a>,包含后续的反应(以及过激反应)。他记录到推ter上大家的反应和后续的文章将Bug的优先级提高了,它的补丁将被放在Java 7 Update 1中,而不是Java 7 Update 2。但是,他也说了,尽管<a href="/misc/goto?guid=4958183180778046498">高优先级Bug</a>(会导致SIGSEGV)会在Java 7 Update 1中修复,但是还有<a href="/misc/goto?guid=4958183187265971984">两个</a><a href="/misc/goto?guid=4958183187990686251">其他</a>Bug仍是中优先级。</p>    <p> 正如<a href="/misc/goto?guid=4958183188716956329">Robert Muir</a>的<a href="/misc/goto?guid=4958183189443938971">分析</a>中所说的,因为这些优化都是在循环最少10,000次后才被引入的,所以很多测试都覆盖不到。已经有了补丁,会纳入以后的Java 7更新中,禁用LoopPredicate优化也能让Java 7摆脱这些问题。<br /> <img title="java.gif" border="0" alt="java.gif" src="https://simg.open-open.com/show/2857ee172fdf6ed9913a4faaceb977f3.jpg" /><br /> </p>    <p> <strong>查看英文原文:</strong><a href="/misc/goto?guid=4958183190166947557">Java7 Hotspot Loop Bug Details</a><br />        <a id="link_source1" class="wz" href="/misc/goto?guid=4958183190902140511" target="_blank">原文链接</a><br /> </p>