JVM性能优化
目录
两种途径,
1是通过dump文件,使用MAT或者IBM工具ISA进行分析;
2是使用jstack实时的对CPU占有过高的进程、线程、定位到代码进行分析;
这里介绍第二种定位方法:
一、定位cpu占用过高的进程
可以采用 : 'top -c' 'shift + M'
或者 'ps -ef | grep java' 或者 'ps -ef|grep openApi'
e.g 此处进程id,pid为 106499
[root@xxx ~]<20201026 10:45:54># top -c
top - 10:54:29 up 780 days, 18:38, 4 users, load average: 1.38, 1.57, 1.59
Tasks: 586 total, 1 running, 558 sleeping, 27 stopped, 0 zombie
%Cpu(s): 3.7 us, 14.1 sy, 0.0 ni, 82.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 16383296 total, 279780 free, 12655688 used, 3447828 buff/cache
KiB Swap: 8388604 total, 6511080 free, 1877524 used. 3166868 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
106499 root 20 0 6245760 3.421g 14040 S 51.7 21.9 3964:19 java -D[Standalone] -server -verbose:gc -Xloggc:/opt/jbshome/appserver/x8601Server6/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:Nu+
65365 root 20 0 4323820 2.237g 14488 S 2.6 14.3 151:22.01 java -D[Standalone] -server -verbose:gc -Xloggc:/opt/jbshome/appserver/x8601Server8/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:Nu+
74910 root 20 0 4232904 1.585g 6028 S 0.0 10.1 1400:03 java -D[Standalone] -server -verbose:gc -Xloggc:/opt/jbshome/appserver/x8601Server3/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:Nu+
81984 root 20 0 4073584 1.422g 6272 S 0.7 9.1 1448:09 java -D[Standalone] -server -verbose:gc -Xloggc:/opt/jbshome/appserver/x8601Server2/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:Nu+
98211 root 20 0 3983248 1.360g 4360 S 1.7 8.7 615:59.82 java -D[Standalone] -server -verbose:gc -Xloggc:/opt/jbshome/appserver/x8601Server4/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:Nu+
27804 root 20 0 3889940 1.198g 4272 S 0.0 7.7 213:34.96 java -D[Standalone] -server -verbose:gc -Xloggc:/opt/jbshome/appserver/x8601Server9/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:Nu+
23639 root 20 0 4814304 166412 5176 S 0.3 1.0 293:22.95 /opt/soft/jdk1.7.0_79/jre/bin/java -Dcom.urbancode.air.mw.common.Monitor.port=35948 -Djava.io.tmpdir=/opt/ibm-ucd-dev/agent/var/temp -Xmx256m -Dfile.encoding=UTF-8 -Dcons+
61792 root 20 0 771704 43344 9120 S 0.0 0.3 152:57.57 /usr/local/cmbagent/data_space/plugin/cmbagent_metric_bee_linux_PLUGIN_42/bin/ca_metric_bee --config /usr/local/cmbagent/data_space/plugin/config/cmbagent_metric_bee_linu+
3498 root 20 0 1535368 37852 2768 S 0.3 0.2 1683:20 /opt/opsware/agent/bin/python /opt/opsware/agent/pylibs/shadowbot/daemonbot.pyc --conf /etc/opt/opsware/agent/agent.args
863 root 20 0 78176 37500 35208 S 0.0 0.2 1906:55 /usr/lib/systemd/systemd-journald
23618 root 20 0 5957796 34272 884 S 0.0 0.2 229:02.96 /opt/soft/jdk1.7.0_79/bin/java -Dfile.encoding=UTF-8 -jar /opt/ibm-ucd-dev/agent/monitor/air-monitor.jar /opt/ibm-ucd-dev/agent /opt/ibm-ucd-dev/agent/bin/worker-args.con+
2953 root 20 0 548976 22976 20520 S 0.0 0.1 966:59.34 /usr/sbin/rsyslogd -n
55474 root 20 0 1004020 16428 924 T 1.0 0.1 0:02.59 ./titanagent -d
108949 root 20 0 794596 11952 4048 S 0.0 0.1 4:15.16 /usr/bin/cmbagent -mode=service
1330 root 20 0 370876 9892 1124 S 0.0 0.1 739:10.96 /usr/sbin/vmtoolsd
367 root 2
二、根据进程id定位到消耗CPU最高的线程
根据进程id定位到消耗CPU最高的线程id: 'top -Hp 106499'
可以看到CPU占有最高的线程id为'106742'
[root@xxx ~]<20201026 10:46:18># top -Hp 106499
top - 10:46:40 up 780 days, 18:30, 4 users, load average: 1.98, 1.52, 1.58
Threads: 134 total, 1 running, 133 sleeping, 0 stopped, 0 zombie
%Cpu(s): 4.7 us, 16.5 sy, 0.0 ni, 78.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 16383296 total, 265632 free, 12678360 used, 3439304 buff/cache
KiB Swap: 8388604 total, 6511068 free, 1877536 used. 3152608 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
106742 root 20 0 6245760 3.421g 14040 R 99.9 21.9 3860:22 java
106518 root 20 0 6245760 3.421g 14040 S 0.3 21.9 2:34.24 java
106579 root 20 0 6245760 3.421g 14040 S 0.3 21.9 0:46.66 java
106758 root 20 0 6245760 3.421g 14040 S 0.3 21.9 3:31.08 java
106764 root 20 0 6245760 3.421g 14040 S 0.3 21.9 15:29.46 java
106779 root 20 0 6245760 3.421g 14040 S 0.3 21.9 3:54.11 java
106833 root 20 0 6245760 3.421g 14040 S 0.3 21.9 3:26.80 java
将线程id转为16进制:得到 '1a0f6'
[root@xxx ~]<20201026 10:47:51># printf "%x" 106742
1a0f6[root@xxx ~]<20201026 10:48:00>#
三、使用 jstack 根据线程id定位对应代码
'jstack processId | grep threadId'
[root@xxx ~]<20201026 10:48:00># jstack 106499 | grep 1a0f6
此时可以定位到相应的java类及方法
或者使用 jmap,实时导出dump文件使用MAT工具分析
使用jmap命令,导出dump: jmap -dump:format=b,file=jvmDump.bin PID
生成jmap生产dump文件
jmap -dump:file=aabbcc.dump PID

使用jmap查看新生代、老年代内存占用:
jmap -heap PID

借助工具 JProfiler、Jstack、Jconsole
https://blog.csdn.net/vicky_pyh/article/details/88797514
3.1 统计进程下线程信息
jstack pid | grep etlJobExecutorThreadPool
jstack 45137 > 101_1216TS.log

21年处理的性能问题
一、遇到的问题
整个系统功能模块使用起来特别卡,响应缓慢。
二、定位思路
1. 查看进程的 CPU、内存使用情况
top -c shift +m

top -c shift + m 1
查看CPU个数,内存大小,如下 为8核、32G(8C-32G)

2. 查看java进程启动配置参数
jinfo 97148


3. 查看java进程 堆栈使用信息
jmap -heap 97148

4. 分析进程存活对象
jmap -histo:live 97148 > 239.log

5. 导出dump文件
jmap -dump:format=b,file=239.dump 97148

三、分析Dump文件 -MAT,定位内存泄露程序逻辑
最常用的两种报告
Top Components : 列出堆内存占比超过1%的对象
Leak Suspects : 内存泄露点分析报告
1. 分析占比最高的对象 Top Components


2. 内存泄露点排查 Leak Suspects


四、其他工具
1. JDK自带工具
jps 查看java进程
jmap 进程堆内存信息
jstack 进程栈信息、线程堆栈信息
jvisualvm Windows可视化的分析工具
jinfo 查看java进程启动参数、属性
jstat 查看GC、FullGC、YoungGC情况
2.市面上通用工具
Jprofile
Arthas (https://arthas.aliyun.com/doc/)
3. 硬件配置
内存: free -m
磁盘: du -lh *

浙公网安备 33010602011771号