掘金 后端 ( ) • 2024-05-02 09:53

近期在项目上遇到了多个系统性能问题,都涉及到JVM调优,这里做个记录。

A项目:GC class unloading时间很长

问题现象

非功能测试环境出现了压测的机器GC日志里有:

[GC remark 2021-11-19T14:36:18.810......[Unloading, 8.2604164 secs]......]// 最长的出现了33s多

网上查到跟这个很类似:记一次CMS unloading class 耗时长调查

更详细的原理可以参考:https://www.cnblogs.com/alchemystar/p/14861423.html

原因分析

查看了一下,系统内存8G,起了几个Java进程,其中一个占了6G多,程序运行时系统内存占用超过80%,此时用free或top可以查看到20G的swap使用量一般超过2G,最多到5.5G,发生了大量的swap交换,把一些不活跃的内存块交换到了磁盘。从而在下次GC扫描时又从磁盘交换回了内存,导致了很长时间的延迟。(也可以用swapon -s查看具体在哪个盘上。)

解决办法

知道了原理,就很好解决:

1)如果内存充足的情况下,可以使用swapoff关闭掉swap,需要有权限,且与运维团队达成一致。

2)尽量不使用swap,具体来说就是降低系统参数swappiness的值(默认0-100)。此数值在Linux上默认为60,CentOS上默认为30。可以降低到10或者1,甚至是0,需要注意的是哪怕是0,也不会完全关闭掉swap,只会在内存低水位时不使用swap,如果内存到高水位(cat /proc/zoneinfo)比如到95%以上,还是会使用swap交换内存到磁盘。需要权限,且与运维达成一致。

$ cat /proc/sys/vm/swappiness30## 临时性修改:$ sudo sysctl vm.swappiness=10## 永久性修改:## 在/etc/sysctl.conf 文件里添加如下参数:vm.swappiness=10

Linux系统swap的介绍参考:swappiness参数的含义和设置 | 云上小悟

Swap的深度原理和控制行为参考:Linux SWAP 深度解读 - 生活费 - 博客园

3)在无法和运维团队达成一致的情况下,可以控制内存水位,就上面的case来说,直接控制xmx6g降低到xmx3g或者4g,运行一段时间,并未出现过长时间的Unloading GC情况。

本文使用 文章同步助手 同步