这是一个困扰了我接近半个月的生产bug。当问题出现后,采取的措施分别是:打印日志,再仍然查不出问题后,改用其他方式实现,先保证不会对用户使用该系统数据照成影响。
在经过两天时间的跟踪,终于找到问题的根源。详细记录如下:
代码在字符串时逻辑里面用到了
StringUtils.contains()
方法,而这个方法主要是调用
String.indexOf()
方法,
如“
,A,B,C,D,".indexOf("A")
> 0
返回
true
;
"A,B,C,D,".indexOf("E")
返回
false
。经过代码分析,结论是这个方法在参数完全一样的情况下运行结果出现了不一致的情况。在
oracle
的官网上查找
jdk
的
bug
库发现了与
String.indexOf
()方法相关的重要的
bug
记录:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6935535
内容是:
String.indexOf() returns incorrect result on x86 with SSE4.2
。决定在生产上重现这个
bug
,于是把如下的代码放在生产上测试。
测试代码:
public class Test{
static int IndexOfTest(String str) {
return str.indexOf("1111111111111xx1x");
}
public static void main(String args[]) {
String str = "1111111111111xx1111111111111xx1x";
str = str.substring(0, 31);
int idx = IndexOfTest(str);
System.out.println("IndexOf(" + "1111111111111xx1x" + ") = " + idx + " in " + str);
}
}
这段代码正确的结果应该是:-1
,经过两次测试结果如下:
命令:java test
输出:IndexOf(1111111111111xx1x)= -1 in 1111111111111xx1111111111111xx1x
命令:java -XX:+UseSSE42Intrinsics -Xcomp test
输出:IndexOf(1111111111111xx1x)= 15 in 1111111111111xx1111111111111xx1x
生产上的
java
版本:
java version "1.6.0_20"
,
CPU
架构:
x86_64 GNU/Linux
,指令集包含:
sse4_2
然后,又在
java version "1.6.0_25"
生产机器上运行,结果是正确的。
解决indexOf的方案,可采用如下方法中的一种:
1.
升级
JDK
版本到
1.6.0_25
;
2.
在
java
启动行加上参数:
-XX:-UseSSE42Intrinsics
。
分享到:
相关推荐
C语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING....
305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)...
ajax 与 java 之间使用 json 交换数据,JSON到Java 对象的转换,Java对象到JSON的转换。 JSONObject object=new JSONObject(javaBean); String jsonStr=object.toString();
java String处理(csdn)————程序
NULL 博文链接:https://xiaoyaoeric.iteye.com/blog/1494989
2021 ICPC沈阳 M -- String Problem(csdn)————程序
c++ string 字符大小写的转换(csdn)————程序
主要介绍了算法练习从String.indexOf的模拟实现开始,需要的朋友可以参考下
最新单片机仿真 字符串函数string.h应用举例最新单片机仿真 字符串函数string.h应用举例最新单片机仿真 字符串函数string.h应用举例最新单片机仿真 字符串函数string.h应用举例最新单片机仿真 字符串函数string.h...
【JAVA】笔记(8)--- java.lang.String 精讲(csdn)————程序
深入了解java中的String-字符串(csdn)————程序
【JDK】分析 String str=““ 与 new String()(csdn)————程序
里面包含大多数的C语言库函数源码,其中string.h中的源码最为多,希望能对大家有所帮助。
String.h函数详解 1、strcpy 函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #include <stdio.h> #include <string.h> int main...
使用c#的string.format 的一些常用的参数
基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用...
使用excel表格统一管理字符串,实现String.xml 和Excel 相互转换
android 国际化 String.xml Excel 相互转换工具
( String.xml转Excel翻译工具.zip....................................................................
public static void main(String[] args) { String haystack = "aaaaasdfasof"; String needle = "df"; char[] hs = haystack.toCharArray(); int hl = hs.length; char[] ns = needle.toCharArray(); int nl ...