我升级到JDK 1.6_18时遇到类似的问题,似乎可以使用以下选项解决:
-server-Xms256m-Xmx748m-XX:MaxPermSize=128m-verbose:gc-XX:+PrintGCTimeStamps-Xloggc:/tmp/gc.log-XX:+PrintHeapAtGC-XX:+PrintGCDetails-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath="/tmp"-XX:+UseParallelGC-XX:-UseGCOverheadLimit# Following options just to remote monitoring with jconsole, useful to see JVM behaviour at runtime-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=12345-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false-Djava.rmi.server.hostname=MyHost
我仍然没有仔细检查(这是生产环境),但是我认为错误是由于两个原因造成的:
1)关于堆和/或永久空间的错误设置(我认为JDK 1.6在堆和永久空间中需要比以前的JVM版本更多的空间)导致OutOfMemoryError,但是
2)在错误的原始设置中有人写了
-XX:+HeapDumponOutOfMemoryError="/tmp"
并不是
-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath="/tmp"
因此,JVM可能无法编写heapdump,而我们仅得到了SIGSEGV(以前的版本在工作目录中写入了heap dump)。
也检查
-server -XX:+UseParallelGC-XX:-UseGCOverheadLimit选项。我认为使用VM参数不是一种解决方法,而是正确的方法,因为垃圾收集器(不仅是)在1.5到1.6之间变化。



