别用Java 7?你是在开玩笑吗?

开发 后端
Java 7 刚刚发布没两天,但来自Lucene 和Solr 社区的某些人立即报料了一些Java 7 中的严重bug。那么到底Java 7 是有什么问题,为什么我们等了5 年的 Java 7 现在却不能使用呢?

Java 7 刚刚发布没两天,但来自Lucene 和Solr 社区的某些人立即报料了一些Java 7 中的严重bug。甚至 Apache Lucene 项目管理委员会成员Uwe Schindler 发布了暂时不要使用Java 7 的警告信息。那么到底Java 7 是有什么问题,为什么我们等了5 年的 Java 7 现在却不能使用呢?让我们来看看实际的情况:

51CTO推荐专题:Java 7正式发布

这个问题跟Java 7 无关,而是跟JVM 有关

首先这个问题是跟HotSpot JVM 有关,而不是Java 7 语言本身的问题。此次发布的 GA 版本包含三个bug:7070134, 7044738 和 7068051 ,这三个bug直接导致JVM 崩溃或者进行错误的计算。

Hotspot是因为PorterStemmer 的sigsegv 而崩溃的

第一个问题(7070134) 是关于错误的编译器对循环的优化,该特性在Hotspot JVM 中是默认启用的,你可以通过 -XX:-UseLoopPredicate 参数来关闭这个特性。如果你想了解关于这个问题的详情,请看Stemmer.java ,编译并允许这个类你将会重现 JVM 崩溃并报严重错误,信息如下:

 

  1. # A fatal error has been detected by the Java Runtime Environment: 
  2. # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000026536da, pid=5432, t 
  3. id=6568 
  4. # JRE version: 7.0-b135 
  5. # Java VM: Java HotSpot(TM) 64-Bit Server VM (21.0-b05 mixed mode windows-amd64 
  6. compressed oops) 
  7. # Problematic frame: 
  8. # J Stemmer.step4()V 

这个错误直接在代码执行过程中发生,在JDK 1.6 是体验不到的。而最近Lucene 做了一些更灵活的基于 PulsingCodec 算法的索引机制,而这个机制相当大的程度上会导致上述的错误。

循环展开优化会导致不正确的结果

第二个bug (7044738) 是“错误的计算”,这个错误极为罕见的发生在OSR (On-Stack Replacement) 编译嵌套循环上,控制流退出且对应的内存没有被考虑到,这直接导致重复的克隆结果,想了解编译细节请看older overview (PDF)

一个最简单的解决办法就是使用 -XX:LoopUnrollLimit=1 参数来避免这个问题。

Clone loop predicate during loop unswitch

第三个bug(7068051) 跟一些老的 feature request 相关,由于一些无效的JVM 统计导致使用循环优化后的JVM 崩溃。

结论

根据这些bug的情况,只有在你大量的使用这些优化方法,那么你才可能已经受 Java 7 中存在的问题所影响。一般情况下是不受影响的。事实上 Java 6 的用户使用了某些优化选项也会存在问题,但因为这些优化选项在 Java 7 中是默认启用的才导致这个问题影响那么大,例如 (-XX:+OptimizeStringConcat or -XX:+AggressiveOpts) ,由于这些问题在 Java 7 发布的前 5 天才被发现,因此 Oracle 来不及解决这些bug,目前 Oracle 似乎也正在准备下一个补丁版本,但对一些高级用户来说,这些都不是问题,因为源码是开放的,你可以做你想做的。

本文译自 http://blog.eisele.net/2011/07/dont-use-java-7-are-you-kidding-me.html

【编辑推荐】

  1. Java 7正式发布
  2. GlassFish游来新版本
  3. NetBeans新版发布,全面支持JDK 7
  4. 11款用于优化、分析源代码的Java工具
责任编辑:艾婧 来源: 开源中国社区
相关推荐

2017-10-26 11:18:13

SSD机械硬盘固态硬盘

2013-11-27 10:16:50

2017-12-27 13:56:16

JavaSCript语言开发

2018-07-23 12:20:52

编程语言Python入门

2014-08-18 10:46:10

IE浏览器

2011-12-11 19:14:32

Siri

2011-12-31 09:11:08

OracleAMD

2017-07-21 16:34:58

戴尔数字化转型

2017-07-17 16:13:28

戴尔数字化转型

2020-04-03 12:08:24

美股时间GMT

2013-04-03 13:52:42

Windows Blu

2020-06-03 10:54:28

戴尔

2021-02-23 09:50:03

运维开发技术

2018-01-18 09:56:11

2022-07-20 14:50:06

马斯克云端

2022-05-01 17:46:01

Windows 11微软操作系统

2012-08-30 10:23:11

2021-04-03 23:42:33

人工智能智能设备技术

2022-01-19 16:46:49

元宇宙造车智能

2009-03-17 08:31:08

Window 7微软用户
点赞
收藏

51CTO技术栈公众号