(1)直接打开Javacore文件查看
直接打开后,可以看到关键信息,可以看到每一个线程的执行栈,以stacktrace的方式显示。通过对javacore的分析可以得到应用是否“卡”在某一点上,即在某 一点运行的时间太长。
例如:
可看出有java/lang/OutOfMemoryError的异常信息。
(2)运用javacore分析工具
下载javacore运行工具jca:
运行java –Xmx1024m –jar jca.jar:
可看线程运行情况:
请求线程可分为以下几种状态: 死锁,Deadlock(重点关注) 执行中,Runnable(重点关注)
等待资源,Waiting on condition(重点关注) 等待监控器检查资源,Waiting on monitor 暂停,Suspended
对象等待中,Object.wait() 阻塞,Blocked(重点关注) 停止,Parked
Deadlock:死锁线程,一般指多个线程调用间,进入相互资源占用,导致一直等待无法释放的情况。
Runnable:一般指该线程正在执行状态中,该线程占用了资源,正在处理某个请求,有可能正在传递SQL到数据库执行,有可能在对某个文件操作,有可能进行数据类型等转换。 Waiting on condition:等待资源,如果堆栈信息明确是应用代码,则证明该线程正在等待资源,一般是大量读取某资源,且该资源采用了资源锁的情况下,线程进入等待状态,等待资源的读取。又或者,正在等待其他线程的执行等。
Blocked:线程阻塞,是指当前线程执行过程中,所需要的资源长时间等待却一直未能获取到,被容器的线程管理器标识为阻塞状态,可以理解为等待资源超时的线程。这种情况在was的日志中,一般可以看到CPU饥渴,或者某线程已执行了XX秒的信息。
一般建议的分析逻辑:
? 在内存溢出时,分析Javacore文件中的线程内容,可以采用自下而上的分析方法。 ? 查看有多少线程被设置了Blocked状态,这些线程是在执行什么请求,并且到了堆栈最
后一步在等待什么资源
? 查找到这些Blocked线程等待的执行线程编号
? 继续查找该线程,分析其堆栈与状态与监控器的记录的信息。一般这些线程会处于
Waiting on condition状态,因为这些线程也是因为资源迟迟未获取到或者执行时间
过长一直处于等待状体,进一步导致队列中其他需要访问这些资源的线程都被设置为Blocked状态。
? 在找到线程后,我们就可以初步将问题缩小到哪些业务应用请求存在问题,是哪一个类
与哪一行代码,其等待的资源是什么。
备注:具体情况具体分析,后续需根据实际经验完善。
3.1.2 heapdump的分析
heapdump文件是一个二进制文件,它保存了某一时刻jvm堆中对象情况,这种文件需要相应的工具进行分析,可以从网上下载最新的分析工具。
因打开heapdump文件对系统内存要求较高,一般只能借用64位的服务器进行分析问题。
HeapDump的生成开关
–export IBM_HEAPDUMP=true –export IBM_HEAP_DUMP=true
–export IBM_HEAPDUMP_OUTOFMEMORY=true –export IBM_JAVADUMP_OUTOFMEMORY=true –export IBM_JAVACORE_OUTOFMEMORY=true –export IBM_HEAPDUMPDIR=
注意:
–通常HeapDump会比较大,尤其是在Heap内存设置很大的情况下 –为了重现问题,得到现场数据,建议先把HeapDump调小,推荐1G以下 –在Window上,如果HeapDump大于1G,可能会无法打开,出现OOM错误 –启动HeapAnalyzer需要指定-Xmx参数
例子:
(1)启动工具:Java –Xmx2048m –jar ha405.jar
(2) 内存按树状引用关系显示