Java内存分析
导出内存映像文件
1.在启动Java程序的时候加入一下参数,当发生内存溢出的时会自动生成内存映像文件;其中XX:HeapDumpPath
指定导出文件的路径
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
2.通过jmap命令实时导出
map -dump:format=b,file=heap.hprof Java进程的pid
内存分析
将生成的内存印象文件导入到mat中,可以协助我们快速定位那个方法或者对象所占用的内容较多。
mat的下载地址
CPU监控
如果遇到CPU飙高,可能是死循环和死锁造成
相关linux命令
- top
- top -p ${pid} -H (查看某pid中所有线程信息)
- printf “%x” 十进制的pid (将十进制的pid转换为十六进制)
- jstack ${java进程pid} (查看java进程的线程信息)
jstack 查看线程信息格式如下,其中需要留意的地方有:1.nid
代表这十六进制的线程pid;2.线程的状态;3.当钱线程的调用堆栈
"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x000000001c6fb800 nid=0x2ecc runnable [0x000000001cc9f000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
- locked <0x00000007c565bcd8> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
- locked <0x00000007c565bcd8> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:61)
工具
内存分析:MAT
Java进程监控:jvisualvm(JDK自带)