Java 7 Hotspot循环Bug详解

开发 后端
上周Java 7 GA发布后,新JIT默认开启的优化中发现了一个问题。虽然这个问题最早是在Lucene搜索索引器的一个用例中出现的,但是它也有可能普遍存在于其他代码之中。

上周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背后的故事,包含后续的反应(以及过激反应)。他记录到Twitter上大家的反应和后续的文章将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摆脱这些问题。

【编辑推荐】

  1. 别用Java 7?你是在开玩笑吗?
  2. 小心bug!慎用Java 7
  3. NetBeans新版发布,全面支持JDK 7
  4. Java 7正式发布
  5. Oracle推出最新Java SE 7版

 

责任编辑:艾婧 来源: InfoQ
相关推荐

2011-07-29 16:55:44

Java 7

2023-09-25 08:08:56

CAA开发者团队

2010-02-23 14:56:18

WCF Bug

2020-12-17 07:39:30

HashMap死循环数据

2024-01-22 10:49:55

C++for循环

2013-12-09 11:01:41

2021-04-15 09:07:52

hotspotJavaC++

2010-11-05 09:47:11

OracleJava虚拟机

2009-07-27 10:08:48

Java 7动态语言JVM

2009-12-29 13:22:17

2010-01-25 15:40:38

Java 6 u18Hotspot垃圾回收

2013-07-18 09:27:25

Hotspot 2.0Wi-FiWLAN

2021-09-10 00:34:22

Java 线程启动

2012-08-06 09:26:19

Java虚拟机垃圾回收

2010-09-08 17:15:45

SQL循环结构

2022-07-05 08:34:22

虚拟机JavaJVM

2020-12-11 05:57:01

Python循环语句代码

2020-06-15 08:39:41

调试工具

2009-10-20 14:08:00

642-892 Hot

2010-02-01 17:24:41

C++循环语句
点赞
收藏

51CTO技术栈公众号