常用Shell命令

查看网络状况

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

使用top去获取进程cpu使用率;使用/proc文件查看进程所占内存。

#!/bin/bash

 for i in `ps -ef | egrep -v "awk|$0" | awk '/'$1'/{print $2}'`

 do

     mymem=`cat /proc/$i/status 2> /dev/null | grep VmRSS | awk '{print $2" " $3}'`

     cpu=`top -n 1 -b |awk '/'$i'/{print $9}'`

 done

常用JDK命令

CPU预警

原生手段
  • 1、查找使用率最高的PID

    1
    top #按P
  • 2、查看最占CPU的线程

    1
    top -Hp $PID
  • 3.查看线程堆栈

jstack -F -l [pid]

1
2
printf "%x\n" $线程     #得到16进制
jstack $PID |grep $16进制 -A 20|less
借助外部工具,下载链接http://soft.xxx.com/Tools/java
sh show-busy-java-threads -c 显示的线程数 -p 进程id
java -jar sjk.jar ttop -p [pid]-o CPU,ALLOC -n 30 (表示按照CPU占用率和堆内存分配速率排序)

sjk因为直接jmx监控的,所以精准度会更高一点。但是不好的地方是,看不到完整的线程堆栈,只有线程名称。因此,实战中,建议多种手段结合操作。
https://github.com/aragozin/jvm-tools

内存预警

时间紧急的情况下

jmap -histo [pid]

时间不紧急的情况下

1
jmap -dump:format=b,file=xxx.hprof [pid]

可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如果连用SHELL jmap -histo pid>a.log可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。

jmap -dump:format=b,file=xxx.hprof [pid],将内存heap输出出来到xxx.hprof文件里,再配合MAT(内存分析工具(Memory Analysis Tool),使用参见:http://blog.csdn.net/fenglibing/archive/2011/04/02/6298326.aspx 或与jhat (Java Heap Analysis Tool)一起使用,能够以图像的形式直观的展示当前内存是否有问题。

查看类的一些信息,如字节码的版本号、常量池等
javap -verbose classname
查看jvm进程
jps

jcmd -vl
查看进程的gc情况
jstat -gcutil [pid] (显示总体情况)


jstat -gc [pid] 1000 10(每隔1秒刷新一次 一共10次)
查看jvm内存使用状况
jmap -heap [pid]
查看jvm内存存活的对象:
jcmd [pid] GC.class_histogram
jmap -histo:live [pid]
把heap里所有对象都dump下来,无论对象是死是活
jmap -dump:format=b,file=xxx.hprof [pid]

线程dump

jstack [pid] #-m参数可以打印出native栈的信息

jcmd Thread.print

kill -3 [pid]

查看目前jvm启动的参数

jinfo -flags [pid] #有效参数

jcmd [pid] VM.flags #所有参数

查看对应参数的值

jinfo -flag [flagName] [pid]

启用/禁止某个参数

jinfo -flag [+/-][flagName] [pid]

设置某个参数

jinfo -flag [flagName=value] [pid]

查看所有可以设置的参数以及其默认值

java -XX:+PrintFlagsInitial

第三方工具

========awesome-scripts========

安装:

curl -s "https://raw.githubusercontent.com/superhj1987/awesome-scripts/master/self-installer.sh" | bash -s

使用:

显示最繁忙的java线程: -c <要显示的线程栈数> -p <指定的Java Process>

opscipts show-busy-java-threads [-c] [-p]

使用greys跟踪方法耗时

opscripts greys [@IP:PORT]

ga?: trace [class] [method]

显示当前cpu和内存使用状况,包括全局和各个进程的。

opscripts show-cpu-and-memory

进入jvm调试交互命令行,包含对java栈、堆、线程、gc等状态的查看

opscripts jvm [pid]

Comments

2018-03-10