jdk调试

1、top

2、top -Hp 23344

3、jstack pid

vmstat。通过这个命令,能基本看出当前机器的运行状态和问题。

运行vmstat 1,就会每隔1秒显示出现在系统的状态,包括cpu的,内存的,io的等等信息。因为今天只是介绍cpu的,所以我们今天先介绍如何看cpu的情况。

· r值:这个值是一个很关键的cpu运行数据,表示在cpu运行队列中等待的进程数。如果这个值很大,则说明很多进程在排队等待执行。更说明现在cpu忙的很,压力山大。

· in和cs:这两个值分别代表中断次数和上下文切换次数。这两个值越大,代表系统在进行大量的进程切换。这说明我们的进程数(或者线程数)太大,导致系统不断的在切换进程,应该尽量减少进程或线程数量。任何切换都是有代价的!

· us、sy、id和wa:这四个值分别代表用户进程、系统进程、空闲和等待的cpu时间占比。us越高说明用户进程占用cpu越高、sy则代表系统进程占用。如果id很高,恭喜你,你的机器很闲;如果wa很高,则说明你的机器因为io很忙而造成cpu等待。

查看类的一些信息,如字节码的版本号、常量池等

javap -verbose classname

查看jvm进程

jps

jcmd -l

查看进程的gc情况

jstat -gcutil [pid] (显示总体情况)

jstat -gc [pid] 1000 10(每隔1秒刷新一次 一共10次)

jstat -gcutil 20954 1000

查看jvm内存使用状况

jmap -heap [pid]

查看jvm内存存活的对象:

jcmd [pid] GC.class_histogram

jmap -histo:live [pid]

把heap里所有对象都dump下来,无论对象是死是活

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

先做一次full GC,再dump,只包含仍然存活的对象信息:

jcmd [PID] GC.heap_dump [FILENAME]

jmap -dump:format=b,live,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

推荐阅读更多精彩内容