最近,应用总会时不时crash(jdk6u24),hs_err_pid.log截取如下:
Current thread (0x0000000040124800): GCTaskThread [stack: 0x0000000000000000,0x0000000000000000] [id=23997]
出错的时候运行的是GCTaskThread,说明是GC的时候出错的,执行的是libjvm.so 代码
R9 =0x00002b1fea3ea080
0x00002b1fea3ea080: <offset 0x9b9080> in /data/dynasty/jdk/jre/lib/amd64/server/libjvm.so at 0x00002b1fe9a31000
出错的代码段在libjvm.so 的偏移量0x9b9080位置(特别要注意这个偏移量,log中的其他内存地址都是不可比较的,只有偏移量,在同一版本的so库中,偏移量相同必然是表示的是同一代码)。多次crash都是这个偏移值。
Heap
par new generation total 943744K, used 438097K [0x00000006f4000000, 0x0000000734000000, 0x0000000734000000)
eden space 838912K, 50% used [0x00000006f4000000, 0x000000070ded3cf8, 0x0000000727340000)
from space 104832K, 12% used [0x000000072d9a0000, 0x000000072e6a09d0, 0x0000000734000000)
to space 104832K, 0% used [0x0000000727340000, 0x0000000727340000, 0x000000072d9a0000)
concurrent mark-sweep generation total 3145728K, used 1573716K [0x0000000734000000, 0x00000007f4000000, 0x00000007f4000000)
concurrent-mark-sweep perm gen total 196608K, used 86517K [0x00000007f4000000, 0x0000000800000000, 0x0000000800000000)
内存一切正常,不是因为内存不足造成的.
代码也找不到任何问题,直到在网上搜到了一个jdk的bug:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7002666,理解为在一定情况下(GC时指针压缩),java本地类库中某段逻辑会引用错误的内存地址。这个bug在jdk6u25版本时修复了。
怀疑是这个问题导致,于是升级jdk版本至6u25,试用了一个多月,应用没有再无故crash。问题解决!
官网引用了一段代码,可验证此bug(要求环境为linux64位系统):
- static byte[] bb;
-
public static void main(String[] args) {
-
bb = new byte[1024 * 1024];
-
for (int i = 0; i < 25000; i++) {
-
Object[] a = test(TestJdk024bug.class, new TestJdk024bug());
-
if (a[0] != null) {
-
-
-
-
System.out.println("i = " + i);
-
System.err.println(a[0]);
-
throw new InternalError(a[0].toString());
-
- }
- }
-
System.out.println("end........");
- }
-
public static Object[] test(Class c, Object o) {
-
-
Object[] a = (Object[])java.lang.reflect.Array.newInstance(c, 1);
-
return a;
- }
static byte[] bb;
public static void main(String[] args) {
bb = new byte[1024 * 1024];//这句的意义在于促进GC
for (int i = 0; i < 25000; i++) {
Object[] a = test(TestJdk024bug.class, new TestJdk024bug());
if (a[0] != null) {
// The element should be null but if it's not then
// we've hit the bug. This will most likely crash but
// at least throw an exception.
System.out.println("i = " + i);
System.err.println(a[0]);
throw new InternalError(a[0].toString());
}
}
System.out.println("end........");
}
public static Object[] test(Class c, Object o) {
// allocate an array small enough to be trigger the bug
Object[] a = (Object[])java.lang.reflect.Array.newInstance(c, 1);
return a;
}
在多线程情况下跑,会出现a[0] != null为true的情况
我的启动参数是-server -Xms30M -Xmx30M -XX:NewSize=4m
相关推荐
"Java Crash Course" contains a multitude of tips and tricks, examples and exercises you can do to grow your Java programming skills to unprecedented levels. We chose the content of this book carefully...
如何分析JAVA crash 为什么程序会Crash? 什么是异常? 如何分析JAVA Crash 程序执行时发生了无法处理的异常 崩溃分为 Java Crash 和 Native Crash
Java Crash Course - The Complete Beginner's Course to Learn Java Programming in 21 Clear-Cut Lessons Paperback – December 20, 2016 Are you bored of the traditional methods people tell you to use to ...
crash, Java平台的shell ______. ~ ~. |`````````,. '.. . '''' | || |'''|'''''. ''```.. '' |_________|| | `.. ' `.. . ' | | `.___
Java开发的SHELL CRaSH
java源码:Java开发的SHELL CRaSH.gz
Android 使用CrashHandler来获取应用的crash信息,并保存到sd卡中
本篇文章主要介绍了jvm crash的崩溃日志详细分析及注意点。具有很好的参考价值,下面跟着小编一起来看下吧
Java开发的SHELL CRaSH.7z
Java101CrashCourse Java编程简介*这些是我从基础到高级的课程等级。 在课程中,将根据SOLID的原理对Java编程的基础进行解释,并附带注释将其添加到源代码中。 除了抽象的,接口的,面向对象的编程部分中的封装类; ...
自定义一个Android应用的Crash异常捕获器
基于Java的开发的SHELL CRaSH.zip
基于java的开发的SHELL CRaSH.zip
Crash
CRASH
首先,我们肯定要在Application里面注册一个CrashHandler,监听应用crash public class TestApplication extends MultiDexApplication { private static TestApplication mInstance; @Override public void ...
做Android应用程序,要尽量避免程序Crash的发生。虽然说零Crash是程序员追逐的最终目标,但是现实的情况是,程序员只能尽量的减少Crash的发生,而几乎不可能完全杜绝Crash。也许,你认为你的应用的健壮性已经近乎...
应用crash后能重启页面将错误日志保存
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...