1. 启动math-game
curl -O https://arthas.aliyun.com/math-game.jar
java -jar math-game.jar
2. 启动arthas
在命令行下面执行(使用和目标进程一致的用户启动,否则可能attach失败):
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
3. 查看dashboard
输入dashboard,按回车/enter,会展示当前进程的信息,按ctrl+c可以中断执行。
4. 通过thread命令来获取到math-game进程的Main Class
thread [进程ID] 会打印线程ID xxx的栈,通常是main函数的线程
thread -b 可以查找死锁的线程

$ netstat -na|wc -l #连接数
$ netstat -nat|grep ESTABLISHED|wc -l #有效连接数,中间的参数 ESTABLISHED表示有效的连接数!
$ netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’ #对各种状态的连接数分组统计结果
jstack查看输出
jstack -l 28367
jstack统计线程数
/opt/java8/bin/jstack -l 28367 | grep ‘java.lang.Thread.State’ | wc -l
jstat -gcutil 9132 1000命令,线上服务器的GC
jmap -histo 2580 ,jmap查看了内存中创建的对象情况
jmap -head pid.堆内存使用情况
jmap -dump:file=a.dump
jmap -dump:live,format=b,file=d:\dump\heap.hprof “pid”
jstat -gc pid interval 查看每次 GC 之后,具体每一个分区的内存使用率变化情况
来查看垃圾收集器的具体设置参数,使用的方式有很多,例如 jcmd pid VM.flags 就可以查看到相关的设置参数。
1.髙cpu排查
步骤:
1.步骤一:查看cpu占用高进程 (top)
2.步骤二:查看cpu占用高线程(top -H -p 17850)
步骤三:转换线程ID (printf “%x\n” 17880)
步骤四:定位cpu占用线程(jstack 17850|grep 45d8 -A 30)
线程状态: new、runnable、running、waiting、timed_waiting、blocked、dead
对于jstack日志,我们要着重关注如下关键信息
Deadlock:表示有死锁
Waiting on condition:等待某个资源或条件发生来唤醒自己。具体需要结合jstacktrace来分析,比如线程正在sleep,网络读写繁忙而等待
Blocked:阻塞
Waiting on monitor entry:在等待获取锁
如果说系统慢,那么要特别关注Blocked,Waiting on condition
如果说系统的cpu耗的高,那么肯定是线程执行有死循环,那么此时要关注下Runable状态。
2.检查死锁
查看时间daunt日志搜索关键字
sed -n ‘/2020-11-23 19:05:59.883 /,/2020-11-23 19:06:55.253/p’ nohup.out |grep “20201117140002545624544059392”
jmap -histo
jmap -dump:format=b,file=heapdump.hprof 7982
jstack pid > jsatck.log
