java常用分析工具

正所谓工欲善其事必先利其器,在日常开发中不可避免会遇到很多诸如异常定位、性能分析的案例,了解并熟悉常用的分析工具会对问题排查起到一个很好的辅助作用。下面列举了常见的定位分析工具。欢迎大家进行补充。

一、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

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180325G0XGB100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券