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可以分析查找死锁哦