Java性能工具分析学习笔记

Linux性能工具命令

系统性能监控命令一

uptime命令
这里写图片描述
输出内容解释

第一个是当前时间
第二个是开机启动多久了
第三个是用户数量
第四个是系统平均负载 1,5,15分钟内的

系统性能监控命令二

top命令
这里写图片描述
和上面的uptime相同都是用来查看CPU(每个进程CPU的占有率),内存等使用情况。

当swap被大量使用时,意味着引起了大量的IO读写,对系统会造成影响。

通过top命令,我们可以查看哪个进行CPU占用率最高,进程PID是多少,进程状态,内存使用情况等等。很好用的命令~~

系统性能监控命令三

vmstat命令

它可以用来统计系统的CPU,内存,swap,io等使用情况。

这里写图片描述

命令参数解释

vmstat (采用频率/秒为单位) (采样次数/多少次后结束采样)
上图命令为:每1秒打印一次,打印4次

系统性能监控命令四

pidstat命令

ubuntu上不是自带的哦~sudo apt-get install sysstat命令安装

它可以细致观察命令 监控CPU,IO,内存

这里写图片描述
命令解释

pidstat -p 1 -u 1 3
-p表示要指定进程号   -u表示查看cpu使用情况 1表示采样频率 3表示采样次数

pidstat的好处是可以在一个指定的进程中查看到它内部的线程使用情况哦~java工程师需要知道的

如图
这里写图片描述
命令解释

查看进程号为1的进程中线程CPU使用情况

Java中自带工具的使用

自带的工具在安装目录下,有很多工具,只介绍常用必会的
这里写图片描述

工具一:jps

功能:
    列出java进程,类似于ps命令
    参数-q可以指定jps只输出进程ID ,不输出类的短名称
    参数-m可以用于输出传递给Java进程(主函数)的参数
    参数-l可以用于输出主函数的完整路径
    参数-v可以显示传递给JVM的参数

这个工具,可以方便的将系统中的java进程一一打印出来,便于进一步的观察
这里写图片描述

看,它可以列出java进程(相当于系统中的ps命令),可以观察到传递给Java进程(主函数)的参数,JVM参数(Xms8m最小堆为8M)。

工具二:jinfo

功能:
    可以用来查看正在运行的Java应用程序的扩展参数,甚至支持在运行时,修改部分参数
    -flag <name>:打印指定JVM的参数值
    -flag [+|-]<name>:设置指定JVM参数的布尔值
    -flag <name>=<value>:设置指定JVM参数的值

这里写图片描述

第一条命令查看Java进程,很快可以找到对应的Java进程PID
第二条使用jinfo来观察进程JVM参数,显示了新生代minor GC15次后会转入老年代
第三条显示是否打印GC详细信息,PrintGCDetails前面有个减号,表示没有开启
如果想动态开启,使用命令jinfo -flag +PrintGCDetails PID号即可

工具三:jmap

功能:
    生成Java应用程序的堆快照和对象的统计信息
    jmap -histo 2972 > ~/map.txt
    Dump堆
    jmap -dump:format=b,file=~/heap.hprof 816

可在map.txt查看到如下类似的信息

num     #instances         #bytes  class name
----------------------------------------------
   1:          4983        6057848  [I       ([I 表示是一个int类型数组)
   2:         20929        2473080  <constMethodKlass>
……………….
1932:             1              8  sun.java2d.pipe.AlphaColorPipe
1933:             1              8  sun.reflect.GeneratedMethodAccessor64
Total        230478       22043360

工具三:jstack

功能: 
    打印线程dump
    -l 打印锁信息
    -m 打印java和native的帧信息
    -F 强制dump,当jstack没有响应时使用

jstack 线程号 >> ~/jstack.txt (>>追加到jstack.txt文件尾部)

可在jstack.txt查看到如下类似的信息

//tid表示线程id(java进程指定的id号不是操作系统分配的) nid是操作系统分配的(十六进制表示!!!)
"main" #1 prio=6 os_prio=0 tid=0x0831c400 nid=0xecc runnable [0x0018f000]
   java.lang.Thread.State: RUNNABLE
    at org.eclipse.swt.internal.win32.OS.WaitMessage(Native Method)
    at org.eclipse.swt.widgets.Display.sleep(Display.java:4657)
    at org.eclipse.ui.application.WorkbenchAdvisor.eventLoopIdle(WorkbenchAdvisor.java:364)
    at org.eclipse.ui.internal.ide.application.IDEWorkbenchAdvisor.eventLoopIdle(IDEWorkbenchAdvisor.java:917)
    at org.eclipse.ui.internal.Workbench$3.eventLoopIdle(Workbench.java:487)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1117)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:997)
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:140)
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:611)

工具四:Visual VM,JConsole

图形化工具,自己慢慢摸索。

实战学习

问题一:

运行一程序ThreadBlockMain,期望输出Hello,World ,结果在程序运行后,程序卡死,没有预期输出。

1.使用jps命令,查看java进程号
2.使用jstack命令,将线程信息放入文件慢慢查看分析

问题二

Java程序HoldCPUMain运行后,发现占用CPU很高,希望能找到原因。

1.使用jps命令,查看运行的java进程号
2.使用top命令(使用cpu利用率 ),找到cpu高的哪个java进程
3.当然找到java进程不行,java运行都是线程级别的,使用 pidstat -p 进程号 1 3 -u -t-t代表显示内部线程)
4.查看的是某个线程后,使用 jstack 进程号 找到nid线程(线程号转为十六进程才可以找到哦)


jstack可以分析查找死锁哦
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值