最近,应用总会时不时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作为一门广泛使用的编程语言,在企业级应用、Web服务、大数据处理等多个领域发挥着重要作用。然而,随着系统复杂度的提升,线上环境中遇到的各种故障问题也日益增多。这些故障可能源于JVM自身...
通过深入浅出的讲解和丰富的实践案例,本书不仅能够帮助读者构建坚实的UML理论基础,还能通过动手操作加深理解,最终达到熟练应用UML进行高效软件建模的目的。对于.NET、Ajax、ASP.NET、C#和Java等领域的开发人员而...
开发者通常使用Java或Kotlin语言编写Android应用,并使用Android Studio作为集成开发环境(IDE)。在这个毕业设计案例中,源码展示了如何构建一个完整的Android应用程序,包括UI设计、逻辑处理和与其他服务的交互。 ...
在"android_crash"这个案例中,可能有一个自定义的日志标签,用于标记与崩溃相关的日志条目。 "android_crash-main"可能是一个项目主分支的命名,表示这是主要的代码仓库或者是处理主线程(UI线程)崩溃的部分。在...
Java的Socket API提供了丰富的功能,便于开发网络应用。 2. JSON或XML数据格式:为了与Erlang服务器进行数据交换,客户端可能使用JSON或XML作为数据序列化格式,这两种格式跨语言兼容性好,易于解析和生成。 3. 多...
### 四、实际应用案例 NeverCrash在实际应用中可以用于多种场景,例如: 1. **异常恢复**:当检测到特定类型的异常时,可以尝试自动恢复应用状态,避免用户失去数据。 2. **错误报告**:收集崩溃日志并上传服务器...
7. **Erlang实践**:从文件名erlang_practice.pdf来看,可能包含Erlang的实际应用案例和技巧,这些内容可以帮助读者更好地理解和运用Erlang。 8. **Erlang Battle**:erlbattle.pdf可能是一个关于Erlang编程竞赛或...
客户端篇包括iOS性能检测新方法、淘宝客户端诊断体系升级、统一跨端API方案Uni API、Flutter在闲鱼的落地应用、Crash处理以及客户端测试策略等。 测试篇讨论了软件测试的基础知识、基于强化学习的质量AI、淘宝泛...
- 定义:使用特定平台的编程语言(如Java或Kotlin用于Android,Swift或Objective-C用于iOS)构建的应用程序。 - 特点:能够充分利用硬件资源,提供最佳用户体验。 - 缺点:开发周期较长,维护成本较高。 #### 2....
例如,由于是新出的技术,项目稳定性相比成熟的技术仍有不足,容易出现Crash,且在不同版本的Android和iOS设备上可能存在兼容性问题。特别是性能方面,在高端和低端设备上可能会表现出极大的差异性。 在React ...
#### 五、Python在电气工程中的应用案例 - **信号处理**: - 使用Python进行信号分析和处理,如傅立叶变换等。 - **图像识别**: - 应用Python进行图像处理和模式识别,如OpenCV库的使用。 - **电路仿真**: - ...
8. **Log在调试中的应用**:在项目说明文档中,可能会讲解如何通过Log进行调试,比如在遇到ANR(应用无响应)或Crash时,分析相关日志以定位问题所在,或者在优化性能时,监控关键操作的时间消耗。 9. **Log与...
理解不同编程语言的语法,例如Python、C++、Java等,以及版本控制工具如Git对于源代码管理至关重要。 3. **计算机资料**:这部分可能包含计算机科学的基本概念、操作系统原理、网络知识、硬件架构等内容。了解这些...
《疯狂Android讲义》是一本深受开发者欢迎的Android学习书籍,第二版更是涵盖了大量更新的知识点和实战案例。在这个名为"AndroidStudy_android_studio_crazy_android_notes"的压缩包文件中,作者按照书中的示例代码...
文章首先简要介绍了故障诊断的基本流程,随后深入讲解了 Thread Dump 的概念及其在故障诊断中的应用,最后列举了一些常见的问题及相应的解决策略。 ### 故障诊断的模式 故障诊断是一个系统的、有条不紊的过程,其...
15. **Machine Learning Crash Course by Google**:包括视频讲座、案例研究和实践练习的快速机器学习课程。 16. **Python Class by Google**:针对有一定编程基础的学习者,提供Python编程课程。 17. **Deep ...