zoukankan      html  css  js  c++  java
  • JDK自带JVM性能调优监控工具jps、jstack、jmap、jhat、jstat

    原文地址:https://www.jianshu.com/p/db954cb968fb

    JVM性能调优监控工具jps、jstack、jmap、jhat、jstat位于JDK的bin目录,这些工具短小精悍,常用于线上系统的分析监测。

    用来解决如下问题

    1. OutOfMemoryError,分析内存不足的原因
    2. 内存泄漏
    3. 线程死锁
    4. 锁竞争
    5. java线程消耗CPU过高

    jps(Java Virtual Machine Process Status Tool)

    JVM 进程状态工具,主要用来输出JVM中运行的进程状态信息

    语法格式:

     
     

    演示如下:


     
     

     
     

    打印多项


     
     

    jstack(java stack trace)

    用来查看某个Java进程内的线程堆栈信息,实时监测系统运行时线程栈信息,而不用暂停程序排查,常用于线上系统的问题排查,一般都是间隔一段时间使用jstack命令打印出当前系统实时快照,然后比对线程在在锁上的执行状态来判断系统是否存在死锁、过度竞争等问题。

    语法格式:

     
     

    演示:
    步骤1:top 命令查看按CPU使用率降序进程ID

     
     

    其实整个系统比较闲,拿来做实验,最占CPU的是进程ID为12622的进程。

    步骤2 :top -Hp pid 命令查看进程中各个线程占用CPU的情况。

     
     

    可见最占CPU的是ID为13037的线程
    与top -Hp pid等价的命令:ps -Lfp pid或者ps -mp pid -o THREAD, tid, time。

    步骤3:printf "%x " 13037 获取16进制nid

     
     

    将十进制13037 转换为16进制为32ed

    步骤4:使用jstack命令分析线程栈信息

    1. jstack -l pid 查看某一JVM进程的所有线程的信息
     
     

    利用linux输出重定向,将线程信息输入到pid12622.dump文件中
    然后使用more命令查看此文件
     
     

    部分信息,以后对这个dump文件信息进行解析
     
     

    http://blog.csdn.net/rachel_luo/article/details/8920596
    1. jstack -l pid | grep nid查看某一JVM进程的指定线程的信息

    利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推,grep是支持正则表达式的实用文本搜索工具。


     
     

    jstat(Java Virtual Machine Statistics Monitoring Tool)

    JVM统计监测工具, 常用来实时监测系统堆的使用情况,以及GC信息、编译信息、类加载信息,常用来判断系统JVM参数是否设置合理,作为系统参数调优的信息统计工具

    语法:

     
     

    根据jstat统计的维度不同,可以使用如下表中的选项进行不同维度的统计,不同的操作系统支持的选项可能会不一样,可以通过-options选项,查看不同操作系统所支持选项。

    jstat -option获取系统支持的选项

     
     

    选项说明


     
     

     
     

    演示

     
     

     
     

    列名信息参考 http://blog.csdn.net/fenglibing/article/details/6411951

    JVM堆内存布局(JDK1.7及之前,JDK1.8已经移除永久代i,而使用元数据,元数据属于堆外内存,但是也间接被GC管理)


     
     

    说明:

     
     

    jmap(Memory Map)和jhat(Java Heap Analysis Tool)

    jmap用来查看堆内存(JVM中各个代的内存情况,对象占用情况)使用状况,还可以导出整个JVM的内存信息,一般结合jhat使用。

    常用命令格式(注意64位JDK,需要加每条命令要加 -J-d64):

    jmap -heap [pid] 查看整个JVM中内存使用情况(还含有JDK版本,GC策略相关等)。

     
     

     
     

    需要注意当使用CMS GC时 jmap -heap命令可能导致Java进程被挂起

    jmap -histo [pid]

    查看JVM堆中存活对象的详细使用情况,常用于分析OutOfMemory

     
     

     
     

    jmap -dump:format=b, file=fileName [pid]

    将整个JVM内存信息以二进制的形式导出到指定文件,这个二进制文件可以通过JHAT来分析


     
     
    分析内存快照

    jhat [file]

    分析内存占用,对象引用关系等, J-Xmx1024意思是将最大堆参数-Xmx1024传递给启动jhat分析的JVM进程的。


     
     

     
     

    通过浏览器访问 http:ip:7000地址,进行分析


     
     

    首页按包进行分组,有全限定类名和此类加载到永久代的堆地址

    点击链接查看指定类的的加载信息,继承信息,数据域、引用信息,以及创建的对象实例信息

     
     

    本文参考如下链接,只是对这些工具的总结笔记

    参考以及拓展链接
    R大(莫枢)借HSDB来探索HotSpot VM的运行时数据
    Thread dump 分析综述
    http://blog.csdn.net/fenglibing/article/details/6411940
    http://www.open-open.com/lib/view/open1390916852007.html
    http://blog.csdn.net/qq_16811963/article/details/52997178



    作者:zhanglbjames
    链接:https://www.jianshu.com/p/db954cb968fb
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    Java8 Stream Function
    PLINQ (C#/.Net 4.5.1) vs Stream (JDK/Java 8) Performance
    罗素 尊重 《事实》
    小品 《研发的一天》
    Java8 λ表达式 stream group by max then Option then PlainObject
    这人好像一条狗啊。什么是共识?
    TOGAF TheOpenGroup引领开发厂商中立的开放技术标准和认证
    OpenMP vs. MPI
    BPMN2 online draw tools 在线作图工具
    DecisionCamp 2019, Decision Manager, AI, and the Future
  • 原文地址:https://www.cnblogs.com/boonya/p/10337619.html
Copyright © 2011-2022 走看看