Java 7 Hotspot循环Bug详解

  上周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摆脱这些问题。

  http://blog.sina.com.cn/s/blog_7362e71e0102wouc.html

  http://blog.sina.com.cn/s/blog_7362e71e0102woud.html

  http://blog.sina.com.cn/s/blog_7362e71e0102woue.html

时间: 2024-11-05 20:39:34

Java 7 Hotspot循环Bug详解的相关文章

Java虚拟机之垃圾回收详解一

Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这些程序包括:实用程序.游戏.商业应用程序.在全世界范围内,Java运行在超过数十亿台个人计算机上,数十亿台设备上,还包括手机和电视设备.Java由一系列的关键组件作为一个整体构建出了Java平台. Java Runtime Edition 当你下载Java,你就得到了Java运行环境(JRE).JR

Java移位运算符 “<<” 作用及详解

左移运算符(<<) 基本用法 将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0). 例:a = a << 2 将a的二进制位左移2位,右补0, 左移1位后a = a *2; 若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2. 举例以及困惑 给出下面的程序,大家可以猜一猜结果是什么? public class MainClass { public static void main(String[] args) { long i = 1L <<

Java垃圾回收机制(GC)详解

Java垃圾回收机制(GC)详解 简介: 垃圾回收GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变.垃圾收集的目的在于清除不再使用的对象.GC通过确定对象是否被活动对象引用来确定是否收集该对象.GC首先要判断该对象是否是时候可以收集.两种常用的方法是引用计数和对象引用遍历. 垃圾收集的算法分析: Java语言规范没有明确地说明JVM使用哪种垃圾

Java语言Socket接口用法详解

Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Server,并通过accept()方法随时监听客户端的连接请求. 扩展: ServerSocket中常用的构造函数及方法 构造函数:ServerSocket(int port) 这是一个构造方法,用于在当前的服务器默认的IP地址上监听一个指定的端口,即在指定的IP和端口创建一个ServerSocket对象

Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO

Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO Java 非阻塞 IO 和异步 IO 转自https://www.javadoop.com/post/nio-and-aio 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO https://blog.csdn.net/column/details/21963.html 部分代码会放在我的的Github:https://github.com/h2p

Java网络编程和NIO详解3:IO模型与Java网络编程模型

Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间.针对linux操作系统而言,将最高的1G字节(从虚拟地址

Java网络编程和NIO详解6:Linux epoll实现原理详解

Java网络编程和NIO详解6:Linux epoll实现原理详解 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO https://blog.csdn.net/column/details/21963.html 部分代码会放在我的的Github:https://github.com/h2pl/ Linux epoll实现原理详解 在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者pol

Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introduction/ netty是基于NIO实现的异步事件驱动的网络编程框架,学完NIO以后,应该看看netty的实现,netty框架涉及的内容特别多,这里只介绍netty的基本使用和实现原理,更多扩展的内容将在以后推出. 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎

Java中的main()方法详解

在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数等等. 在看Java中的main()方法之前,先看一个最简单的Java应用程序HelloWorld,我将通过这个例子说明Java类中main()方法的奥秘,程序的代码如下: 1 /** 2 * Java中的main()方法