正所谓工欲善其事必先利其器,在日常开发中不可避免会遇到很多诸如异常定位、性能分析的案例,了解并熟悉常用的分析工具会对问题排查起到一个很好的辅助作用。下面列举了常见的定位分析工具。欢迎大家进行补充。
一、jvm相关工具
1.1 jps
查看系统中运行的jvm进程 (可通过man jps查看命令的详细手册),第一列为进程ID (vmId)
jps -l -v -m ;jps -lvm
-l :展示主类的包路径
-m :展示传给主方法的参数
-v:展示传给jvm的系统参数
其中25402为tomcat进程,25437为本机一个自定义运行中main所在类进程
1.2 jstack
线程运行堆栈,jstack -l pid
1.3 jstat
统计jvm运行数据,gc统计,jstat [-gcutil][-gcnew]pid
1.4 jmap
同样是jdk自带的分析工具,查看内存使用情况,dump 内存转存
jmap -dump:[live,] format=b, file=filename pid,生成hprof 二进制转存文件
jmap -heap pid,堆的配置参数和使用情况。 更多细节可以参考https://www.cnblogs.com/davidwang456/p/3464540.html
1.5 jhat
同样是jdk自带工具,分析java堆内存
jhat pid, 然后本地http://localhost:7000/查看内存堆栈上加载的类详细数据
1.6 jvisualvm
分析jvm的可视化工具,jdk自带或者可官网下载。 jvisualvm命令启动或者安装好后可直接launchpad打开。可以安装plugins。比如visual gc. refer:http://blog.csdn.net/lifuxiangcaohui/article/details/37992725
http://blog.51cto.com/tianxingzhe/1651384
也可以导入jmap生成的hprof dump文件(jmapdump:format=b,file=/Users/zhoudongping/taskHeap.hprof 15211)
1.7 jconsole
jdk自带,命令行启动,平时用的较少
1.8 Memory Analyzer
可官网下载eclipse插件版和非插件版
二、系统相关工具
2.1 top
查看系统负载系统资源情况
top -o cpu -O mem -s 5 -n 20: 按cpu使用率降序、内存使用率升序排序,刷新间隔为5s, 最多展示20个 (mac os)
Sort the processs according to CPU usage (descending) and r memory size (ascending), sample and update the display at 5 second intervals, and limit the display to 20 processes.
top -pid
:只展示某个进程信息
注:在 linux 机器上使用 top 命令。常用的快键键是
p 键 - 按 cpu 使用率排序
m 键 - 按内存使用量排序
这 2 个快捷键在 mac 上都不一样。对应的是,先输入 o,然后输入 cpu 则按 cpu 使用量排序,输入 rsize或者mem 则按内存使用量排序。
如果记不清了,可以在top 的界面上按?,在弹出的帮助界面中即可看到或者man top
2.2 ps
查看系统进程命令
linux下常用操作如下
ps -ef 或 ps aux :查看所有进程常
ps -ef | grep java 或 ps aux | grep java :查看java进程(查看其他进程类似: tomcat/nginx/mysql)
ps -ef | less或 ps -ef | grep java | more :单屏无法显示完可添加 less、more分屏展示(linx管道“|” 过滤)
ps -ef | grep java | grep -v grep :过滤当前grep命令进程
注:MacOS下 ps -ef
| less
2.3 netstat
网络端口统计
netstat -s | grep "restransimit":网络重传统计
netstat -an :查询端口网络状态,eg. netstat -an | grep 8080
2.4 df, du
磁盘文件查看命令,df:磁盘, du:文件
df -h 单位自行换算
三、其他工具
3.1 grep
关键词过滤文本,支持正则, 如
grep key -A n 查看key关键词上下n行
grep正则表达式元字符集:
^ 锚定行的开始 如:'^grep'匹配所有以grep开头的行。
$ 锚定行的结束 如:'grep$'匹配所有以grep结尾的行。
. 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
* 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。
[] 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^] 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
\(..\) 标记匹配字符,如'\(love\)',love被标记为1。
\ 锚定单词的开始,如:'\匹配包含以grep开头的单词的行。
\> 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
x\ 重复字符x,m次,如:'0\'匹配包含5个o的行。
x\ 重复字符x,至少m次,如:'o\'匹配至少有5个o的行。
x\重复字符x,至少m次,不多于n次,如:'o\'匹配5--10个o的行。
\w 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\b 单词锁定符,如: '\bgrep\b'只匹配grep
.*一起用代表任意字符
3.2 find
文件查找命令,同样支持正则表达式. 如下
find . -name 'Union*.java' //根据文件名搜索
find . -name 'Union*.java' | xargs grep 'ShopId'
find . -name 'Union*.java' -exec grep 'ShopId' {} \;
find . -name 'Union*.java' -exec ls -l {} \;
find / | xargs grep function 查找系统根目录下面的所有文件的内容中包含有function字符串的文件列表。
find . -type f |xargs grep -i “Mary” : 在所有文件中检索字符串Mary
ls *~ |xargs rm -rf 删除所有以~结尾的文件
3.3 tail
从尾部开始查看文件内容,与head相反
tail -f 文件名 : 实时查看日志文件
tail -n 100 文件名 : 查看倒数100行记录
tail -f -n 1000/data/applogs/tomcat/catalina.out
3.4 less,more,cat
翻页查看,less 是linux快速浏览文件的命令(防止误修改文件)
less主要就是 浏览文件 查找文件 浏览文件涉及到的就是上下翻页 具体翻页的按键如下表
less查看一个文件时,可以使用类似vi的command命令,在command模式下按G跳到文件末尾,再使用f或B来翻页less filename:G跳到底部, :g跳转到顶部,就可以用 向上 向下 箭头 或 向滚动鼠标来查看log了
more命令和less类似, cat也是查看文件内容工具
3.5 awk
文本处理工具
awk ''
统计某个文件夹下的文件占用的大小
ls -l |awk 'BEGIN END'
[end]size is 8.25889 M
更多请参考:https://www.cnblogs.com/losbyday/p/5854707.html
3.6 sed
文本替换工具,
sed的命令格式: sed [option] 'sed command'filename
sed -i's/IPADDR/ip/w ip.txt' test :#把sed操作的文件内容保存到另外一个文件ip.text中,w表示保存,ip.txt文件名
可参考:http://blog.jobbole.com/109088/
四、案例
4.1 java命令查看占用cpu高的java线程
先得到进程的pid:通过top或者ps
#ps -ef | grep process_name | grep -v "grep" | awk ''
然后输出线程id, 按cpu和内存排序
# ps mp pid -o THREAD,tid(mac下是top -pid
)
# ps -mp $pid -o THREAD,tid,time,rss,size,%mem|sort -rn
# printf "%x\n" $pid //转换成16进制
# jstack $pid|grep $a -A 30
注:在macos中ps不支持输出线程id, 因此上面方法仅对linux有效,mac下如何获取暂时未找到有效办法,在stackoverflow上看到这样一个讨论
On Linuxps -eLf | grep my-process-namegives a list of the threads within my process along with the TID of each thread.
On OSXps -M pidgives me the list of the threads but does not show the TID of each thread.
How can I see thread TIDs under a single process from the command line? refer:
https://cnbin.github.io/blog/2015/06/19/mac-xia-de-top-he-htop-zhi-ling/
Command-line Number of thread per process on MacOS:ps M
| wc -l
领取专属 10元无门槛券
私享最新 技术干货