1. 查看内存与Swap使用概况
使用free -h命令查看系统内存和Swap的使用情况。若Swap的used值持续增长且available内存(可用的物理内存+可回收的缓存)持续减少,提示可能存在内存泄漏。
2. 定位占用Swap的具体进程
top命令进入交互模式,按Shift+M(按内存占用排序)或Shift+P(按CPU占用排序),观察Swap列(部分系统需按f键添加SWAP字段)找出Swap占用最高的进程。for file in /proc/*/status ; do awk '/Vmswap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file ; done | sort -k 3 -n -r | head
该命令会显示进程名和对应的Swap使用量(单位:KB),帮助快速定位泄漏源。3. 深入分析进程内存行为
对于疑似泄漏的进程,使用pidstat(需安装sysstat包)监控其内存变化趋势:
pidstat -p <PID> -r 1 # 每1秒刷新一次,观察RSS(常驻内存)和VSZ(虚拟内存)的变化
若RSS持续增长且不回落,说明进程存在内存泄漏。
1. 重启异常进程
若确认某进程是泄漏源(如无状态服务),可通过kill命令终止该进程(kill -9 <PID>),再重启服务(如systemctl restart <service_name>)。注意:此方法仅适用于可重启的服务,且需确保数据不会丢失。
2. 代码级修复(针对自研程序)
Valgrind(适用于C/C++程序)检测内存泄漏点,运行命令:valgrind --leak-check=full ./your_program
工具会输出详细的泄漏位置(如未free的内存地址),帮助开发者修复代码。std::unique_ptr(独占所有权)、std::shared_ptr(共享所有权)等智能指针替代裸指针,自动管理内存生命周期,减少泄漏风险。try-catch块,确保异常发生时能正确释放已分配的内存(如delete、free)。3. 第三方工具分析
VisualVM、JProfiler或Arthas工具分析堆内存,查看Histogram(类实例数量)和Leak Suspects(泄漏嫌疑点),定位未释放的对象(如静态集合持有对象引用)。pprof工具分析内存堆,通过import _ "net/http/pprof"开启HTTP接口,访问http://localhost:6060/debug/pprof/heap下载堆快照,用pprof可视化工具(如go tool pprof)查看内存分配热点。1. 调整Swappiness参数
swappiness(默认值60)控制内核将内存数据移至Swap的倾向性(0=尽量避免,100=积极使用)。降低该值可减少Swap使用,缓解泄漏对系统的影响:
sudo sysctl vm.swappiness=10
/etc/sysctl.conf文件,添加以下行:vm.swappiness=10
运行sudo sysctl -p使配置生效。2. 增加Swap空间(临时缓解)
若物理内存不足,可通过创建Swap文件扩大Swap容量(注意:Swap性能远低于物理内存,仅作为临时解决方案):
sudo dd if=/dev/zero of=/swapfile bs=1G count=4
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
/etc/fstab文件,添加以下行:/swapfile none swap sw 0 0
3. 优化应用程序配置
-Xmx,最大堆)、元空间大小(-XX:MaxMetaspaceSize),避免因堆内存不足导致频繁Full GC和使用Swap。例如:java -Xmx4G -XX:MaxMetaspaceSize=512M -jar your_app.jar
innodb_buffer_pool_size(InnoDB缓冲池大小),建议设置为物理内存的60%-70%,减少磁盘I/O和Swap使用。htop(更直观)或top命令定期查看内存和Swap使用情况;或使用监控工具(如Prometheus+Grafana)搭建可视化面板,设置Swap使用率阈值(如80%)告警。/var/log/syslog或dmesg输出,查看是否有内存不足(OOM)相关的错误日志(如Out of memory: Killed process),及时定位问题进程。oom-killer杀进程)。仅在物理内存充足且确认Swap是性能瓶颈时,才考虑永久关闭(注释/etc/fstab中的Swap行并重启)。