查看进程id
首先需要知道我们关心的java程序的进程id,才能方便后续的操作。jps -lvm
如果不是java程序,则可以用命令ps aux | grep [name]
。
查看进程运行参数
jinfo -flags <PID>
查看进程各项统计信息
类加载统计:jstat -class <PID>
此外还有: 编译统计、垃圾回收统计、堆内存统计、新生代垃圾回收统计、新生代内存统计等等统计信息。
参考: https://www.cnblogs.com/yjd_hycf_space/p/7755633.html
https://blog.csdn.net/zhaozheng7758/article/details/8623549
缺点: 都是文本、英文,不一定马上看得懂。
生成3种dump文件
为了了解更详细进程信息,可以生成3种dump文件:(然后用各种(图形)工具辅助查看)
- Thread Dump: 线程运行状态;
- Heap Dump: 堆内存状态;
- Core Dump: 进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。
Thread Dump
拿到进程id以后,我们可以用jstack
命令生成Thread Dump
文件。
1 | jstack <PID> |
然后可以:
- 把Thread dump文件装载入
jvisualvm
查看。 - 直接文本编辑器打开看;
- 粘贴到网站,辅助查看: http://spotify.github.io/threaddump-analyzer/
jstack
是jvm原生支持的,底层实现原理:
tool.jar
中提供的一个Attach Listener
,监听相关socket连接。sa-jdi.jar
中的监听。
Heap Dump
还可以通过jmap
命令+进程id,输出Heap Dump
。
1 | jmap -histo:live <PID> |
输出到文件:
1 | jmap -dump:live,format=b,file=heap.dump <PID> |
需要注意这些指令都可能导致进程挂起,不能频繁在线上环境执行。
得到heap dump
文件以后,可以:
- 用jhat命令:
jhat -port 443 [filename]
,然后访问http://localhost:443
查看; - 装入到
jvisualvm
中查看.
参考: http://www.importnew.com/27804.html
Core Dump
还可以输出进程的核心转储文件,方法是对进程发送一些会产生core dump
的信号,例如:kill -3 [PID]
用了上述命令以后core dump
数据会输出到进程的标准输出中。(可以事先重定向stdout)
详细的信号包括:
Signal | Value | Action | Comment |
---|---|---|---|
SIGHUP | 1 | Term | Hangup detected on controlling terminal or death of controlling process |
SIGINT | 2 | Term | Interrupt from keyboard |
SIGQUIT | 3 | Core | Quit from keyboard |
SIGILL | 4 | Core | Illegal Instruction |
SIGABRT | 6 | Core | Abort signal from abort(3) |
SIGFPE | 8 | Core | Floating point exception |
SIGKILL | 9 | Term | Kill signal |
SIGSEGV | 11 | Core | Invalid memory reference |
SIGPIPE | 13 | Term | Broken pipe: write to pipe with no readers |
SIGALRM | 14 | Term | Timer signal from alarm(2) |
SIGTERM | 15 | Term | Termination signal |
SIGUSR1 | 30,10,16 | Term | User-defined signal 1 |
SIGUSR2 | 31,12,17 | Term | User-defined signal 2 |
SIGCHLD | 20,17,18 | Ign | Child stopped or terminated |
SIGCONT | 19,18,25 | Cont | Continue if stopped |
SIGSTOP | 17,19,23 | Stop | Stop process |
SIGTSTP | 18,20,24 | Stop | Stop typed at tty |
SIGTTIN | 21,21,26 | Stop | tty input for background process |
SIGTTOU | 22,22,27 | Stop | tty output for background process |
jvisualvm
上述几个工具比较零散,而且大部分是文本,不能直观迅速感知内存是上升还是下降.
可以直接用jvisualvm
命令启动图形界面,直接监控本地的java进程(包括堆、thread dump信息等,还能进行操作)。
用法:
- 监控本地java进程;
- 装载heap dump,thread dump文件查看;
- 远端启动
jstatd
/jmx
,打开端口权限,远程监控java程序。
jstatd
准备配置文件:
1 | vi jstatd.all.policy |
内容如下:
1 | grant codebase "file:/usr/java/default/lib/tools.jar" { |
启动:
1 | jstatd -J-Djava.security.policy=./jstatd.all.policy |
默认会启动在1099端口。
启动以后jvisualvm
就能创建远程主机,并监控它所有的java程序了。
jmx
jstatd
和jmx
似乎不能同时用,不然jvisualvm
会卡死.
需要在启动java的时候就指定相应的端口等信息:
1 | nohup java \ |
然后在jvisualvm
中创建远程JMX
连接。