jvm debug指令汇总
1.lsof(list open files)是一个列出当前系统打开文件的工具,即fd的数目。系统默认单线程只能打开65525个。也可以查看设备。
lsof -p 29701|wc -l 可以查看29701线程打开的fd数目。
2.strace命令
strace strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
3.Jstack
jstack用来查看jvm当前的thread dump的。可以看到当前Jvm里面的线程状况。 这个对于查找blocked线程比较有意义。
(1) jstack -l pid查看线程堆栈信息,
(2)while true;do sleep 5;jstack -l 29701 >> /tmp/typhon-check.log;cat /tmp/typhon-check.log|grep WAITING |wc -l;done
用来不断的查看某个线程出现的堆栈信息的量。
4.ulimit
ulimit -a,可以列出系统的最大进程数、单线程最大fd打开数(Linux操作系统对一个进程打开的文件句柄数量的限制,高并发常需要配置)。
5.jps命令可以查看当前的java线程。
jps -lv可以查看当前java线程的配置参数。
6.jstat
- jstat利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloader,compiler,gc情况;
- 特别的,一个极强的监视内存的工具,可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量,以及加载类的数量。
(1)jstat -gcutil pid interval count 可以查看线程gc信息,各个区的情况。
即:jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] ,前几项的都是百分比。
关于s0(survivor)、E(eden)、O(old)、P(permgen)都是百分比。后面C是gc次数,T是gc的时间。YGC是young gc次数,YGCT是yong gc时间。FGC是full gc的次数,FGCT是full gc的时间。GCT是gc总时间。
(2).jstat -gc pid interval count 显示的会比gcutil全一点,前几项关于eden、survivor、old的都是真实值,单位字节。
前面结尾是C是配额(eden等),U是使用量。后面关于GC,C是次数,T是时间。
7.jmap 查看内存:
打印出某个java进程(使用pid)内存内的所有‘对象’的情况(如:产生那些对象,及其数量),也可以打印出堆的使用信息概要。。
- 监视进程运行中的jvm物理内存的占用情况,该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量;
- 系统崩溃了?jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等等
(1) jmap -histo pid:列出class在jvm中的实例数。
Q:统计实例最多的类 前十位有哪些?
A:jmap -histo pid | sort -n -r -k 2 | head -10 (红色的第2列是类在jvm中的个数)
Q:统计合计容量前十的类有哪些?
A:jmap -histo pid | sort -n -r -k 3 | head -10 (红色的第3列是类在jvm中所占容量)
说明:
sort命令的部分参数含义解释如下
-n :使用“”纯数字”进行排序(默认是以文字类型来排序)
-r : 反向排序
-k :以那个区间(field)来进行排序的意思
使用jmap -histo[:live] pid查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象,如下:
jmap -histo:live 21711 | more
(2)jmap -heap pid: 打印出堆的配置信息以及使用情况。
(3)jmap dump
jmap -dump:format=b,file=test.bin 4939
尤其值得一提的是这个命令可以到处一份binary heap dump的bin文件,这个文件能够直接用,Eclipse Memory Anayliser 来分析,并找出潜在的内存泄漏的地方.
8.jinfo
- 监视进程运行中的jvm物理内存的占用情况,该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量;
- 系统崩溃了?jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等等
9.netstat
(1) netstat -ntlp可以查询线程与网络端口情况。
(2) netstat -ntap 可以查看线程和端口状态,比如是否是有大量TIME_WAIT的情况。
(3) netstat -anlp 可以查看什么client连接到server的盖端口上。比如如下,可以看到10.139.176.174:57797连接到了服务器的8000端口上,client端也可以查连到那个server上。(windows用netstat -an|findstr 8000)
TIME_WAIT是发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒,TIME_WAIT状态下的socket不能被回收使用。过多就会造成fd过多,资源耗尽。
10.df
df -h查看磁盘信息
11.du 查看某个路径下的文件所占磁盘大小。
du -csh *:查看本路径下所有文件的磁盘信息大小。
12.top
top查看线程的状态,相当于windows任务管理器
top命令可以实时显示各个线程情况。要在top输出中开启线程查看,请调用top命令的“-H”选项,该选项会列出所有Linux线程。在top运行时,你也可以通过按“H”键将线程查看模式切换为开或关。即top -p pid 以后,输入大写H,即可查询改进程下的线程情况。
13.ps
ps ax:查看线程状态
ps -T -p <pid> :在ps命令中,“-T”选项可以开启线程查看。下面的命令列出了由进程号为<pid>的进程创建的所有线程。
14.sar -b
可以直接查看cpu的主频,要查看CPU、内存的使用情况可以使用sar!
15.Btrace
需下载包,可以针对线上代码,写surround包围代码,查看一些变量的值。
16.java
启动java时,增加jmx接口。
17.查看某个linux进程打开的线程数
cat /proc/20571/status,里面有一个Threads选项。
18. iostat 查看io情况
iostat -d -k 1 10 #查看TPS和吞吐量信息(磁盘读写速度单位为KB)iostat -d -m 2 #查看TPS和吞吐量信息(磁盘读写速度单位为MB)iostat -d -x -k 1 10 #查看设备使用率(%util)、响应时间(await)
iostat -c 1 10 #查看cpu状态
19.查看机器内存情况
free -h 显示出G为单位,也可以用free -g
free -m 以m为单位
也可以cat /proc/meminfo