jstat
- jstat -gc pid
可以显示gc的信息,查看gc的次数,及时间。
其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
2.jstat -gccapacity pid
可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,
如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,
PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。
其他的可以根据这个类推,OC是old内纯的占用量。
3.jstat -gcutil pid
统计gc信息统计。
free
free 命令显示系统内存的使用情况:
持续的观察内存的状况,此时可以使用 -s 选项并指定间隔的秒数:
[root@iZj6cces3mggq80hc9a4srZ aqi]# free -h -s 3
total used free shared buff/cache available
Mem: 7.4Gi 4.0Gi 1.9Gi 1.0Mi 1.5Gi 3.1Gi
Swap: 0B 0B 0B
total used free shared buff/cache available
Mem: 7.4Gi 4.0Gi 1.9Gi 1.0Mi 1.5Gi 3.1Gi
Swap: 0B 0B 0B
Mem 行(第二行)是内存的使用情况。
Swap 行(第三行)是交换空间的使用情况。
total 列显示系统总的可用物理内存和交换空间大小。
used 列显示已经被使用的物理内存和交换空间。
free 列显示还有多少物理内存和交换空间可用使用。
shared 列显示被共享使用的物理内存大小。
buff/cache 列显示被 buffer 和 cache 使用的物理内存大小。
available 列显示还可以被应用程序使用的物理内存大小。
df
查看磁盘剩余空间使用df -hl命令:
[root@iZj6cces3mggq80hc9a4srZ aqi]# df -hl
文件系统 容量 已用 可用 已用% 挂载点
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.8G 0 3.8G 0% /dev/shm
tmpfs 3.8G 500K 3.8G 1% /run
tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
/dev/vda1 40G 8.9G 32G 23% /
tmpfs 763M 0 763M 0% /run/user/0
iostat
tps:该设备每秒的传输次数。
kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read:读取的总数据量;
kB_wrtn:写入的总数量数据量;
[root@iZj6cces3mggq80hc9a4srZ aqi]# iostat
Linux 4.18.0-240.22.1.el8_3.x86_64 (iZj6cces3mggq80hc9a4srZ) 05/29/2021 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
21.23 0.01 1.29 0.01 0.00 77.46
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 1.97 29.02 34.23 20566998 24261464
top
[root@iZj6cces3mggq80hc9a4srZ aqi]# top
top.original - 16:30:36 up 8 days, 4:56, 3 users, load average: 0.05, 0.03, 0.24
Tasks: 115 total, 1 running, 114 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 96.7 id, 0.0 wa, 0.0 hi, 3.3 si, 0.0 st
MiB Mem : 7626.9 total, 1944.1 free, 4101.2 used, 1581.5 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 3225.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 179552 7400 4248 S 0.0 0.1 0:41.08 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.11 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kblockd
9 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
- 统计部分:
重点关注参数: 第2行 Tasks, 总进程数,运行的进行数,睡眠的进程数 停止的进程数 僵尸进程数
第3行 %Cpu(s) us 用户空间CPU占用率 sy ; 内核空间CPU 占用率
第4行 Mem 行 物理内存总量 空闲物理内存 已使用的物理内存 内核缓存使用量
- 进程信息
各进程参数,重点关注列
PID
、 COMMAD
、 %Cpu
、 %MEM
- 导出dump
jmap -dump:live,format=b,file=/tmp/xxxx.hprof pid
用 jprofiler
打开进行分析
- 把Xms和Xmx设置为相同,这样可以减少GC后重新分配带来的性能开销
-
jvm参数,可以通过增大XX:MaxPretenuringThreshold参数值,让对象更有可能被Minor GC回收掉,但同时得用XX:PretenureSizeThreshold这个参数限制存放在新生代的最大的对象是多少,防止对象在新生区,占用空间大,会由于空间不足而导致很多小对象进入到老年区,最后可以增大Survivor区的内存使用率-XX:TargetSurvivorRatio这个参数(默认为50%),降低进入老年代的频率。
- arthas 这个挺好用的
参考
jstat命令详解: https://blog.csdn.net/zhaozheng7758/article/details/8623549
Java后端线上问题排查常用命令收藏: https://mp.weixin.qq.com/s/7cInYxzRfQ-c7wKQBlbFXg#2c139b8c-5d9c-fbb2-fd3c-619172a46344
jvm 内存泄漏现象和处理方案: https://blog.csdn.net/it_czz/article/details/105857845
如何根据DUMP文件分析线上问题: https://www.cnblogs.com/linus-tan/p/9328004.html
JVM日志参数十全大补丸: https://mp.weixin.qq.com/s/XZFEgf1ZS7gNt7lku3TF4g