我们的JVM在生产过程中不时会出现分段故障,感觉就像是某种竞争条件.
设置重现: - Linux上的JRE jre1.6.0_24 Ubuntu 9.10和Debian 4.x 64位多核AMD - Apache tomcat 6.0.24 ... 6.0.32
用fastdebug重新编译java会重现问题(这个gcc -g1).但是,它不会产生比我们在这里有更多有用的信息.
使用debug重新编译java不会重现问题(这是gcc -g加上可能的一些-DSOMETHING代码调试标志).
任何帮助试图解决这个问题的人都会非常感激.
使用Oracle的1.6.0_24 jdk生成的核心文件.gdb出现了:
Program terminated with signal 11, Segmentation fault.
#0 0x00002aaab7b10666 in NET_Read () from
/usr/local/jdk1.6.0_24/jre/lib/amd64/libnet.so
Run Code Online (Sandbox Code Playgroud)
好的,所以我的装配真的很生锈.记住这一点:
(gdb) info frame
Stack level 0, frame at 0x4b3e0040:
rip = 0x2aaab7b10666 in NET_Read; saved rip 0x2aaab7b0d53b
called by frame at 0x4b3f0090
Arglist at 0x4b3dffc8, args:
Locals at 0x4b3dffc8, Previous frame's sp is 0x4b3e0040
Saved registers:
rbx at 0x4b3e0008, rbp at 0x4b3e0010, r12 …Run Code Online (Sandbox Code Playgroud) 以下代码导致为两个地图生成相同的哈希码,任何想法?
import java.util.HashMap;
import java.util.Map;
public class Foo
{
@SuppressWarnings("unchecked")
public static void main (String[] args)
{
Map map;
map = new HashMap();
map.put("campaignId", 4770L);
map.put("location", "MINI_PROFILE");
map.put("active", "true");
map.put("lazy", true);
System.out.println(map.hashCode());
map = new HashMap();
map.put("campaignId", 4936L);
map.put("location", "MINI_PROFILE");
map.put("active", "true");
map.put("lazy", false);
System.out.println(map.hashCode());
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
-1376467648
-1376467648
Run Code Online (Sandbox Code Playgroud)
简单地更改密钥名称就足以使代码生成两个不同的哈希代码.