1.首先,用jps查看其进程id
类似下图
2.Jmap
此命令可以用来查看内存信息,实例个数以及占用内存大小
命令: jmap -histo 13244
num:序号
instances:实例数量
bytes:占用空间大小
class name:类名称,[C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[][]
查看堆信息
jmap -heap 13244
堆内存dump
jmap ‐dump:format=b,file=eureka.hprof 13244
也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=./ (路径)
JVM设置
‐Xms10M ‐Xmx10M ‐XX:+PrintGCDetails ‐XX:+HeapDumpOnOutOfMemoryError ‐XX:HeapDumpPath=D:\jvm.dump
可以用jvisualvm命令工具导入该dump文件分析
3. jstack
用jstack加进程id查找死锁
类似下图:
jstack 13244
还可以用jvisualvm自动检测死锁
远程连接jvisualvm
启动普通的jar程序JMX端口配置:
java ‐Dcom.sun.management.jmxremote.port=8888 ‐Djava.rmi.server.hostname=192.168.1.1 ‐Dcom.sun.management.jmxremot e.ssl=false ‐Dcom.sun.management.jmxremote.authenticate=false ‐jar microservice‐eureka‐server.jar
注:
-Dcom.sun.management.jmxremote.port 为远程机器的JMX端口
-Djava.rmi.server.hostname 为远程机器IP
jstack找出占用cpu最高的线程堆栈信息
1,使用命令top -p ,显示你的java进程的内存情况,pid是你的java进程号,比如13244
2,按H,获取每个线程的内存情况
3,找到内存和cpu占用最高的线程tid,比如19664
4,转为十六进制得到 0x4cd0,此为线程id的十六进制表示
5,执行 jstack 19663|grep -A 10 4cd0,得到线程堆栈信息中 4cd0 这个线程所在行的后面10行,从堆栈中可以发现导致cpu飙高的调 用方法
6,查看对应的堆栈信息找出可能存在问题的代码
4、Jinfo
查看正在运行的Java应用程序的扩展参数
查看jvm的参数
jinfo -flags 13244
查看java系统参数
jinfo -sysprops 13244
5、jstat
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下: jstat [-命令选项] [vmid] [间隔时间(毫秒)] [查询次数]
注意:使用的jdk版本是jdk8
jstat -gc 13244
还有其他命令选项