zoukankan      html  css  js  c++  java
  • java应用性能分析工具-JDK命令行工具

    背景

    我们做的java应用涉及到kafka消息消费后入数据库的业务,由于kafka协议复杂,入库前包括解析,分析,组装数据过程,在数据量较大时(3000万以上,峰值1亿)

    CPU使用率常常飙升,时不时会有入库过程阻塞,处理变得非常慢,在其他的文章中总结过基础的top,free等命令来分析CPU和内存使用情况,作为java开发提升的技

    能这里专门开一个JDK的命令行工具,来分析研发编码过程可能出现的性能问题(OOM,cpu消耗高,dead lock等)

    介绍

    Oracle官网将JDK tool分了很多类,这里主要讲2大类5小类(java7)

    官网地址:https://docs.oracle.com/javase/8/docs/technotes/tools/unix

    1、jstack——java堆栈信息工具(查看某个进程内的线程堆栈信息)

    >> jstack [option] pid

    >> jstack [option] executable core

    option:掌握一个 -l (long listings),打印额外的锁信息,发生死锁时用jstack -l pid 观察死锁持有情况

    使用jstack 定位最耗CPU的堆栈对应的代码段过程:

    (1)>> ps -ef |grep dgList  找出应用的pid(dgList是我的tomcat应用),查出结果pid=63977

    (2)>> top -Hp 63977 找到耗费CPU时间最长的可能线程pid=135784

     (3)>> printf "%x" 135784   结果为21268(135784 的16进制值)

    (4)>> jstack 63977 |grep 21268   从打印的堆栈信息中找到线程135784对应堆栈信息片段

    以下是选择排在前三的线程pid,分别grep后的结果:

    "redisMessageListenerContainer-9421" #9849 prio=5 os_prio=0 tid=0x00007f317c001000 nid=0x21268 runnable [0x00007f32312d5000]

    "ruleKafka-0-C-1" #79 prio=5 os_prio=0 tid=0x00007f332e167000 nid=0xffdd runnable [0x00007f32fcedb000]

    "basicKafka-0-C-1" #81 prio=5 os_prio=0 tid=0x00007f332e1f6000 nid=0xffdf runnable [0x00007f32fccd9000]

    第一个是监听redis消息判断license的业务,第二三个是监听kafka消息的两个业务功能

    另:>>    jstack pid > thread.txt   可以将命令结果转存到thread.txt文件中

    2、jmap——java内存映像工具

    >> jmap -heap pid   查看进程堆内存信息

     >> jmap -histo:live pid | head -20   查看堆内存中的活动对象数目、大小统计直方图排前17的,[:live]为可选

    >> jmap -dump[:live,] format=b, file=filename  pid

    将堆信息以hprof binary格式写到 filename中,生成的文件可使用jhat(Java Heap Analysis Tool)读取和分析,filename为文件

    如执行  >>jmap -dump format=b,file=dump.hprof 63977   将在当前目录下生成dump.hprof 二进制文件

    读取改文件需要使用jhat命令

     

     jhat的默认端口为7000,在浏览器中输入192.168.0.11:7000即可查看(假设当前主机是192.168.0.11的ip)

    4、jstat——虚拟机统计信息监视工具

    5、jps——虚拟机进程状况工具(Java Virtual Machine Process Status Tool)

    command  >> jps [options] [hostid]

    说明:hostid不指定,则默认为当前主机

    掌握-v参数:输出传递给JVM的参数(jps -v)在诊断JVM相关问题的时候,这个参数可以查看JVM相关参数的设置

    这个命令发挥的空间不大,如果是查自己的应用,直接找pid即可;一般想整体查看很多应用的进程(企业级的,一台服务器部署多个tomcat应用)来定位时会用到

    参考:

    https://www.cnblogs.com/lazy-fc/p/11297953.html

    https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHHGFAE

  • 相关阅读:
    电子科技大学实验中学PK赛(二)比赛题解
    伊苏比的梦幻之旅(三)比赛题解
    电子科技大学实验中学PK赛(一)比赛题解
    伊苏比的梦幻之旅(二)比赛题解
    伊苏比的梦幻之旅(一)比赛题解
    The Solution of UESTC 2016 Summer Training #1 Div.2 Problem C
    The Solution of UESTC 2016 Summer Training #1 Div.2 Problem B
    c++11 多线程间共享数据 <c++ concurrency in action>
    c++11 多线程 2<<c++ concurrency in action>>
    c++11 多线程 1<<c++ concurrency in action>>
  • 原文地址:https://www.cnblogs.com/yb38156/p/12218974.html
Copyright © 2011-2022 走看看