昨天晚上启动jboss之后,发现点击某个页面,总是crash掉;控制台信息如下:
----------------------------------------------------------------------------------------------------------------
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6dd1a7a1, pid=6044, tid=2744
#
# JRE version: 6.0_22-b04
# Java VM: Java HotSpot(TM) Server VM (17.1-b03 mixed mode windows-x86 )
# Problematic frame:
# V [jvm.dll+0x1aa7a1]
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#
----------------------------------------------------------------------------------------------------------------
后来同事将他的JOBSS给我,当时是OK了,同事说是JVM启动参数不一样,当时也没有深究;结果今天早上上来在什么都没有修改的情况下,居然又crash了;乘着这个加深学习了下JVM的一些参数配置知识。
(一)产生错误的原因
造成严重错误的原因有多种可能性。Java虚拟机自身的Bug是原因之一,但是这种可能性很小。在绝大多数情况下,是由于系统的库文件、API或第三方的库文件造成的;或者是系统资源的短缺也有可能造成这种严重的错误。
(二).对日志文件的分析
日志头中“EXCEPTION_ACCESS_VIOLATION ”标明了日志错误类型。一般还有另外一种常见的错误类型:EXCEPTION_STACK_OVERFLOW;
日志中另外一个有用的信息就是:
# Problematic frame:
# V [jvm.dll+0x1aa7a1]
它说明Crash的时候,JVM正在从哪个库文件执行代码。除了“V”以外,还有可能是“C”、“j”、“v”、“J”。具体的表示意思如下:
FrameType Description:
C: Native C frame
j: Interpreted Java frame
V: VMframe
v: VMgenerated stub frame
J: Other frame types, including compiled Java frames
EXCEPTION_ACCESS_VIOLATION加上“ # Problematic frame: # V [jvm.dll+....”说明一般是内存回收引起的问题。对于内存回收的错误,一般采取改变回收的算法和参数的方法来绕过去。可改变内存回收的算法,或者优化JVM配置参数来解决。
所以在本次错误中,优化JBOSS中JVM的启动参数可以解决问题。但是为什么一模一样的配置,昨天晚上OK的,今天早上却失败了?具体的我现在也没有明确的答案,我猜测可能是在特定的条件下(比如说本机的系统资源,远程调用的系统稳定性,以及网络是否繁忙等都可能会产生影响)产生的。
(三).其他常见错误
1.java.lang.OutOfMemoryError: Java heap space
当设置JBOSS启动参数:
set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx128m
后台日志报错:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxxAO' defined in resource loader resource [/xxx/biz/bean/biz-xx.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxxServices' defined in resource loader resource [/xxx/biz/bean/biz-xxx.xml]: Invocation of init method failed; nested exception is java.lang.OutOfMemoryError: Java heap space
分析:
这里是指最大堆内存设置太小,可以通过设置JBOSS启动参数:–Xmx 增加堆内存即可;
2.java.lang.OutOfMemoryError: GC overhead limit exceeded
当设置JBOSS启动参数:
set JAVA_OPTS=%JAVA_OPTS% -Xms128m –Xmx256m
日志错误:
java.lang.OutOfMemoryError: GC overhead limit exceeded
分析:
意味着太多的时间花在了垃圾收集上面,SUN的建议是指定垃圾回收的算法,加上启动参数-XX:-UseGCOverheadLimit,从而限制JVM在抛出OutOfMemoryError之前限制其耗费在GC上的时间。
SUN的原文:
The parallel / concurrent collector will throw an OutOfMemoryError if too much time is being spent in garbage collection: if more than 98% of the total time is spent in garbage collection and less than 2% of the heap is recovered, an OutOfMemoryError will be thrown. This feature is designed to prevent applications from running for an extended period of time while making little or no progress because the heap is too small. If necessary, this feature can be disabled by adding the option -XX:-UseGCOverheadLimit to the command line.
3.另外一种常见错误:ava.lang.OutOfMemoryError: PermGen space
这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。
解决方法: 手动设置MaxPermSize大小
另外:
JBOSS启动参数说明
另外:
JBOSS启动参数说明
-Xms256m 初始的java内存堆大小 256M
-Xmx2048m 最大的java内存堆大小 2048M
-XX:PermSize=128m GC预留的内存,如果你的应用有大量的Class被动态载入或卸载,你应该不这个参数设大些
-XX:MaxPermSize=256m 最大的GC预留内存
-Dsun.rmi.dgc.client.gcInterval=3600000 RMI客户端GC发生周期的设定
-Dsun.rmi.dgc.server.gcInterval=3600000 RMI服务端GC发生周期的设定
参考资料:
http://blog.csdn.net/sfdev/archive/2008/01/24/2063928.aspx
http://developers.sun.com.cn/blog/yutoujava/entry/20070411#comments
分享到:
相关推荐
在Java开发过程中,JVM(Java Virtual Machine)的崩溃可能会导致应用程序无法正常运行,严重影响服务的稳定性和用户体验。...通过深入学习和实践,开发者可以更好地理解和处理这类问题,确保Java应用的稳定运行。
总之,理解和分析JVM崩溃日志是诊断和解决Java应用程序性能问题的关键步骤。通过深入研究日志内容,我们可以找到可能导致崩溃的原因,从而采取相应的优化措施或修复代码,确保应用的稳定性和可靠性。
本篇将详细介绍如何自定义Android应用的Crash异常捕获,同时确保捕获过程不会对应用性能造成显著影响,并在遇到严重异常时仍能让APP正常Crash,以便收集到关键的错误信息。 首先,我们需要了解Android的异常处理...
Java崩溃转储分析是Java应用程序出现问题时的一种诊断手段。当Java虚拟机(JVM)遇到不可恢复的错误或异常时,会生成一个“崩溃转储”(也称为堆转储或核心转储),其中包含了程序运行时刻的内存状态、线程信息、类...
"SHELL CRaSH"可能指的是一个与Java相关的项目或者错误情况,但具体的含义需要通过压缩包内的文件来进一步解读。由于我们无法直接查看压缩包内容,我将根据Java开发的一些常见知识点进行详细介绍。 1. **Java基础**...
6. **异常处理**:通过配置`wrapper.stop.timeout`和`wrapper.crash程序`,你可以定义服务在遇到错误时的行为,如等待一段时间再尝试重启或执行特定脚本。 7. **自动更新**:如果应用需要定期更新,Wrapper还提供了...
1. **Java应用(包括system_server)的native(JNI)层的Native Crash**:这类崩溃通常出现在应用程序或系统服务的JNI代码中。 2. **Native进程(如surfaceflinger、mediaserver等)的Native Crash**:这类崩溃发生...
### Java线上故障分析:线程dump与堆内存分析 #### 引言 在现代软件开发中,Java作为一门广泛使用的编程语言,在企业级应用、Web服务、大数据处理等多个领域发挥着重要作用。然而,随着系统复杂度的提升,线上环境...
在Android应用开发过程中,程序崩溃(Crash)是一个常见的问题,它影响用户体验,并给开发者带来调试的挑战。对于使用NDK开发的本地代码,定位问题尤为困难,因为涉及到底层的C/C++语言特性,如指针错误、内存管理...
这不仅有助于开发者在发生错误时快速定位问题,还能提供有价值的设备信息和用户环境数据,从而提升应用的稳定性和用户体验。同时,结合服务器端的日志分析系统,可以实现远程监控和统计,为持续优化应用提供有力支持...
【JAVA异常机制与安卓应用程序崩溃分析】 JAVA异常机制是JAVA编程中的重要组成部分,它主要用于处理程序运行时出现的错误情况。当JAVA代码中发生异常时,程序会立即停止当前流程,转而寻找合适的异常处理代码,这个...
6. **API设计**:SHELL CRaSH可能提供一个API供其他Java应用程序集成,这涉及到面向对象设计原则和接口设计。 7. **单元测试**:为了确保代码质量,项目可能包含JUnit或其他测试框架的测试用例。 8. **文档**:源...
"Android全局Crash捕获"是一种技术手段,用于监控和处理应用运行时可能出现的异常情况,以防止程序突然崩溃并丢失用户数据。这个Demo提供了捕获和记录这些异常日志的方法,帮助开发者追踪并修复错误。 首先,我们要...
总的来说,Android应用的Crash定位与捕获涉及到异常处理机制、日志收集、错误分析和测试策略等多个方面。通过自定义异常处理器、编写详细的Crash日志、利用第三方工具,开发者可以有效地管理Crash,提高应用的稳定性...
### Java虚拟机问题分析大全 #### 一、引言 ...通过对稳定性问题和性能问题的有效分析与解决,可以显著提高Java应用程序的质量和用户体验。希望本文能够为遇到JVM问题的开发者提供一定的帮助和指导。
对于那些需要处理复杂Java应用程序故障排查的技术人员来说,这份文档将是非常有用的参考指南。通过对javacore文件的深入研究,技术人员能够更快地定位问题所在,并采取有效的措施来优化系统性能,提高系统的稳定性和...
这些服务通常提供详细的崩溃报告和错误分析,便于团队管理和修复。 四、Crash_Demo实践 1. **创建Crash_Demo**:这个压缩包中的Crash_Demo可能是实现了一个模拟崩溃的应用示例,包含了故意触发崩溃的代码和捕获...
在Android开发中,当应用程序发生崩溃(crash)时,为确保用户体验并收集错误信息以进行调试,开发者通常会设置相应的处理机制。本篇将详细探讨Android应用在崩溃后的自动重启以及如何保存错误日志。 一、理解...
在描述中提到的“crash release”,是指该版本特别关注于应用的崩溃报告,旨在帮助开发者在应用上线后,及时获取到用户的崩溃信息,以便进行有效的错误修复。 标签“release”强调了这是一个用于生产环境的版本,...
JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...