java学习JAVA

JVM内存分析

2019-03-07  本文已影响239人  接着奏乐接着舞S

获取JVM的dump文件

1、JVM启动时增加两个参数:
    #出现 OOME 时生成堆 dump: 
    -XX:+HeapDumpOnOutOfMemoryError
    #生成堆文件地址:
    -XX:HeapDumpPath=/opt/logs/jvm/

Tomcat配置自动生产dump文件参考Tomcat性能调优

2、发现程序异常前通过执行指令,直接生成当前JVM的dump文件,127465是指JVM的进程号
jmap  -dump:format=b,file=jvmDump   127465

注:第一种方式是当前JVM出现问题后才能生成dmp文件,实时性不高,第二种方式在执行时,JVM是暂停服务的,所以对线上的运行会产生影响。所以建议第一种方式

IBM HeapAnalyzer分析内存

IBM HeapAnalyzer 下载地址

java  -jar  ha456.jar

启动HeapAnalyzer


图片.jpg

HeapAnalyzer启动后,通过菜单File->Open打开生成的dump文件jvmDump。


图片.jpg

通过dump信息分析内存泄漏的对象。主要思路是堆内存占用比例,比例越大说明堆内存消耗越多,最后需要在程序中找到使用该对象的地方,再分析程序,确定产生内存泄漏的原因。

利用jstack获取JVM的线程dump文件

jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

#173824是jvm进程号
jstack 173824 | tee -a jstack.log

利用IBM Thread and Monitor Dump Analyzer分析dumap文件

IBM Thread and Monitor Dump Analyzer 下载地址

java -jar  jca463.jar

启动IBM Thread and Monitor Dump Analyzer


图片.jpg

启动后,通过菜单File->Open打开生成的dump文件jstack.log


图片.jpg

在IBM Thread and Monitor Dump Analyzer for Java工具中,请求线程可分为以下几种状态:
  1.死锁,Deadlock(重点关注)
  2.执行中,Runnable(重点关注)
  3.等待资源,Waiting on condition(重点关注)
  4.等待监控器检查资源,Waiting on monitor
  5.暂停,Suspended
  6.对象等待中,Object.wait()
  7.阻塞,Blocked(重点关注)
  8.停止,Parked
  Deadlock:死锁线程:一般指多个线程调用间,进入相互资源占用,导致一直等待无法释放的情况。
  Runnable:一般指该线程正在执行状态中,该线程占用了资源,正在处理某个请求,有可能正在传递SQL到数据库执行,有可能在对某个文件操作,有可能进行数据类型等转换。
  Waiting on condition:等待资源,如果堆栈信息明确是应用代码,则证明该线程正在等待资源,一般是大量读取某资源,且该资源采用了资源锁的情况下,线程进入等待状态,等待资源的读取。又或者,正在等待其他线程的执行等。
  Blocked:线程阻塞,是指当前线程执行过程中,所需要的资源长时间等待却一直未能获取到

上一篇下一篇

猜你喜欢

热点阅读