• Java 使用命令对堆线程分析


    一.dump基本概念

            在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题。这些文件记录了JVM运行期间的内存占用、线程执行等情况,这就是我们常说的dump文件。常用的有heap dump和thread dump(也叫javacore,或java dump)。我们可以这么理解:heap dump记录内存信息的,thread dump是记录CPU信息的。

            heap dump:

            heap dump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件。Heap Analyzer工具通过分析HeapDump文件,哪些对象占用了太多的堆栈空间,来发现导致内存泄露或者可能引起内存泄露的对象。

            thread dump:

            thread dump文件主要保存的是java应用中各线程在某一时刻的运行的位置,即执行到哪一个类的哪一个方法哪一个行上。thread dump是一个文本文件,打开后可以看到每一个线程的执行栈,以stacktrace的方式显示。通过对thread dump的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,如数据库查询,长期得不到响应,最终导致系统崩溃。单个的thread dump文件一般来说是没有什么用处的,因为它只是记录了某一个绝对时间点的情况。比较有用的是,线程在一个时间段内的执行情况。

    两个thread dump文件在分析时特别有效,困为它可以看出在先后两个时间点上,线程执行的位置,如果发现先后两组数据中同一线程都执行在同一位置,则说明此处可能有问题,因为程序运行是极快的,如果两次均在某一点上,说明这一点的耗时是很大的。通过对这两个文件进行分析,查出原因,进而解决问题。

    二.利用JDK自带的工具获取thread dump文件和heap dump文件

            使用的JDK工具在JDK_HOME/bin/目录下,使用到jmap和jstack这两个命令。

    1.获取heap dump文件

            windows下切换到JDK_HOME/bin/,执行以下命令:jmap -dump:format=b,file=heap.hprof pid 

            linux下切换到JDK_HOME/bin/,执行以下命令:./jmap -dump:format=b,file=heap.hprof pid

            这样就会在当前目录下生成heap.hprof文件,这就是heap dump文件。

    D:Developmenthuishi-server (dev)
    $ jps
    1744 Application
    21744 RemoteMavenServer
    22148
    12312 Jps
    18060 Launcher
    
    D:Developmenthuishi-server (dev)
    $ jmap -dump:format=b,file=heap.hprof 22148
    Dumping heap to D:Developmenthuishi-serverheap.hprof ...
    Heap dump file created

    2.获取thread dump文件

            windows下执行:jstack pid > thread.txt

            linux下执行:./jstack pid > thread.txt

            windows/linux则会将命令执行结果转储到thread.txt,这就是thread dump文件。有了dump文件后,我们就能借助性能分析工具获取dump文件中的信息。

    D:Developmenthuishi-server (dev)
    $ jstack 22148 > thread.txt

    3.如果我们只需要将dump中存活的对象导出,那么可以使用:live参数

    jmap -dump:live,format=b,file=heapLive.hprof pid

    D:Developmenthuishi-server (dev)
    $ jmap -dump:live,format=b,file=heaplive.hprof 22148
    Dumping heap to D:Developmenthuishi-serverheaplive.hprof ...
    Heap dump file created

    三.使用工具分析java heap dump文件

            现在我们使用一些图形化工具,来帮助我们分析文件中的信息,有效地定位问题。

    1.使用JDK自带的jhat命令

            jhat是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。

    D:Developmenthuishi-server (dev)
    $ jhat -port 3000 heaplive.hprof
    Reading from heaplive.hprof...
    Dump file created Thu May 24 17:25:07 CST 2018
    Snapshot read, resolving...
    Resolving 2752025 objects...
    Chasing references, expect 550 dots......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
    Eliminating duplicate references......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
    Snapshot resolved.
    Started HTTP server on port 3000
    Server is ready.

    但是这种方式很不好分析,最好使用专业的分析工具,比如MAT

    http://www.cnblogs.com/toSeeMyDream/p/7151635.html

    http://www.javatang.com/archives/tag/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F

    http://www.lightskystreet.com/2015/09/01/mat_usage/

  • 相关阅读:
    快考试了
    16号了
    终于找到网吧了,写写今天
    又打了一天的篮球
    (转载)Andoid2.X各字段意义
    (转载)AndroidMatrixCursor
    (转载)非常好 必须要顶
    (转载)Android Cursor之MergeCursor
    七天开发安卓软件(二)
    “Visual Studio.net已检测到指定的Web服务器运行的不是Asp.net1.1版。您将无法运行Asp.net Web应用程序或服务”问题的解决方法
  • 原文地址:https://www.cnblogs.com/hongdada/p/9083947.html
Copyright © 2020-2023  润新知