JVM内存分析

作者: 接着奏乐接着舞S | 来源:发表于2019-03-07 19:56 被阅读239次

    获取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:线程阻塞,是指当前线程执行过程中,所需要的资源长时间等待却一直未能获取到

    相关文章

      网友评论

        本文标题:JVM内存分析

        本文链接:https://www.haomeiwen.com/subject/calhpqtx.html