1.JVM命令
1.1 jps
查看当前的java进程的PID例:
jps
查看详情例:
jps -l
1.2 jinfo
查看某个java进程目前的参数设置的情况例:
jinfo -flag MaxHeapSize 5768
查看参数详情例:
jinfo -flag 5758
1.3 jstat
查看当前java进程类装载的情况,每1000毫秒打印一次,打印10次例:
jstat -class 5768 1000 10
查看垃圾回收的信息,每1000毫秒打印一次,打印10次例:
jstat -gc 5768 1000 10
1.4 jstack
查看某个java进程当前存在的线程的堆栈信息,可以用来查看死锁的情况
jstack 5768
1.5 jmap
可以打印出堆转存储快照例:
jmap -heap 5768
堆内存相关信息例:
jmap -dump:format=b,file=heap.hprof 5768
可以在设置在OutOfMemoryError时自动dump出文件,设置如下
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
2 常用工具
2.1 jconsole 监听某一个Java进程
界面如下:
然后可以选择连接想要监听的进程
2.2 jvisualvm 监听某个Java进程
界面如下:
2.3 mat/perfma 分析内存相关的信息
使用mat可以对之前dump下来的heap.hprof文件进行查看,也可以使perma(在线工具)。
2.4 gceasy.io / gcviewer 分析垃圾回收
3 性能优化
3.1 使用mat分析OOM问题
可以使用Histogram
查看实例数量
Leak Suspects
可以查看内存泄漏的情况
可以看出来这里是因为Person对象创建太多引起的
3.2 GC优化
通过不断调整,观察GC日志的吞吐量和停顿时间,寻找最佳值
输出GC日志到gc.log文件
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+UseG1GC
-Xloggc:gc.log
借助网站:gceasy.io对日志进行分析
主要就是调整各种参数,垃圾收集器—>查看吞吐量和停顿时间的变量 高吞吐量,低停顿时间
也可以使用本地工具:gcviewer-1.36-SNAPSHOT.jar
运行命令:
java -jar gcviewer-1.36-SNAPSHOT.jar
主要关注吞吐量和停顿时间