显然,Java7在循环优化方面存在一些严重的bug:谷歌搜索.
从报告和错误描述中,我很难判断这个bug有多严重(除非你使用Solr或Lucene)。
我想知道:
- 我的(任何)程序受影响的可能性有多大?
- 这个bug足够确定吗,普通测试是否能够捕获它?
注意:我不能让我的程序用户使用-XX:-UseLoopPredicate
来避免这个问题。
复制错误的方法很简单。打开Eclipse(我的版本是Indigo),然后进入帮助/搜索。输入一个搜索字符串,你会注意到Eclipse崩溃了。查看日志即可。
# Problematic frame:
# J org.apache.lucene.analysis.PorterStemmer.stem([CII)Z
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
#
--------------- T H R E A D ---------------
Current thread (0x0000000007b79000): JavaThread "Worker-46" [_thread_in_Java, id=264, stack(0x000000000f380000,0x000000000f480000)]
siginfo: ExceptionCode=0xc0000005, reading address 0x00000002f62bd80e
Registers:
现在已经两年过去了,我相信这个错误(或其变体)仍然存在于OSX上的1.7.0_25-b15版本中。
通过非常痛苦的试错,我已经确定使用Java 1.7与Solr 3.6.2和自动提交<maxTime>30000</maxTime>
似乎会导致索引损坏。只有当我使用1.7和maxTime
为30000时才会发生问题,如果我切换到Java 1.6,就没有问题了。如果我将maxTime
降低到3000,也没有问题。
JVM不会崩溃,但它会导致RSolr在Ruby中死机,并出现以下堆栈跟踪:https://gist.github.com/armhold/6354416。在保存几百条记录后,它可靠地执行此操作。
鉴于这里涉及到许多层面(Ruby,Sunspot,Rsolr等),我不确定是否能将其简化为明确证明JVM错误的内容,但感觉就是这种情况。顺便提一下,我也尝试了JDK 1.7.0_04,它也出现了这个问题。