Linux服务器内存占用接近100%时的排查方法
作者:Java小白笔记
想知道Linux内存怎么查,本文教你用free、top、ps快速找到占用内存最多的进程,还详细讲解Java服务的JVM参数设置和nohup后台运行,帮你轻松解决内存问题,需要的朋友可以参考下
服务器内存满了,想要排查具体是哪个服务或进程占用了大量内存,可以通过 Linux 系统的常用命令来查看和定位。下面给你详细讲解常用的排查步骤和工具:
一. 查看总内存使用情况
free -m
-m参数以 MB 单位显示内存信息- 可以快速判断总内存、已用、空闲、缓存等情况
二. 查看内存使用最多的进程
推荐使用 top 或 htop(若已安装):
用 top
top
进入后,按 %MEM 列排序(通常默认就是按 CPU 排序,可以按 M 键切换到按内存排序)
按 M 键后,最占内存的进程会排在最上面,查看进程名和 PID
按 q 退出
用 htop(如果安装了)
htop
界面更友好,可以直接点击内存列排序,搜索进程等
三. 用 ps 命令列出占用内存最多的进程
这是最直接的命令行方式:
ps aux --sort=-%mem | head -20
- 显示占用内存最多的前20个进程
- 输出字段包括用户、PID、CPU、内存%、启动时间、命令等
四. 查看某个进程的详细内存使用情况
假设你找到了某个 PID(比如 1234),可以查看具体内存使用:
pmap -x 1234
或者
cat /proc/1234/status | grep Vm
五. 查看系统中所有服务的内存占用情况(结合 systemctl)
如果你想针对服务,可以先找到对应的进程 PID 后,再结合 systemctl status 服务名 去确认。
六. 常见场景诊断
- Java 服务:用
jcmd、jmap或jstat查看 JVM 内存 - 数据库服务:如 MySQL、PostgreSQL 也可能占用大量内存
- 缓存服务:Redis、Memcached 等也应关注
七. 实用脚本示例:查看 Top 10 占用内存最多的进程及对应服务名
ps -eo pid,ppid,cmd,%mem --sort=-%mem | head -10
如果你想结合服务名,可能需要你了解进程对应的服务。
八. 清理建议
排查到占用内存的进程后:
- 如果是非关键服务,可以考虑重启或停止
- 如果是内存泄漏的服务,建议查看服务日志或抓取线程堆栈分析
- 优化配置,合理分配服务内存
九. 堆内存设置
nohup java -Xmx1G -Xms1G -XX:MaxMetaspaceSize=1024M -XX:+UseG1GC `cat jvmparams` -jar spider.jar --server.port=6085 > _spider.out 2>&1 &
1.nohup
- 作用:忽略挂断信号(SIGHUP),即使你关闭了终端,程序仍然会继续运行。
- 适合远程服务器启动长期运行的程序。
2.java
- 调用 Java 虚拟机启动 Java 程序。
3. JVM 参数部分
-Xmx1G:设置 JVM 最大堆内存为 1GB。-Xms1G:设置 JVM 初始堆内存为 1GB。两者相同可以避免堆内存动态扩展带来的性能消耗。-XX:MaxMetaspaceSize=1024M:设置元空间(Metaspace,存放类元数据的内存区域)最大为 1024MB。-XX:+UseG1GC:启用 G1 垃圾回收器(适合大内存和响应时间要求场景)。`cat jvmparams`:将jvmparams文件内容作为 JVM 参数插入。如果jvmparams文件中有其他 JVM 参数,会被补充进来。- 例如
jvmparams文件包含:-XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError,则这些参数也会被加上。
- 例如
4.-jar spider.jar
- 表示运行名为
spider.jar的可执行 Jar 包。 - JVM 会加载并执行该 Jar 包中的
Main-Class指定的主程序。
5.--server.port=6085
- 这是传给 Java 应用程序(比如 Spring Boot)的参数,指定服务监听的端口为 6085。
- 注意这是程序参数,不是 JVM 参数。
- 该参数通常被框架识别用来设置服务端口。
6. 重定向部分:> _spider.out 2>&1
> _spider.out:将标准输出(stdout)重定向到_spider.out文件。2>&1:将标准错误(stderr)重定向到标准输出(stdout),也就是和标准输出一起写入_spider.out。- 这样所有运行日志和错误信息都保存在
_spider.out文件中,方便查看和调试。
7. 结尾的&
- 表示将该命令放到后台运行,启动后会立即返回 shell 提示符,程序在后台继续运行。
- 适用于远程服务器或需要继续使用终端的场景。
总结
- 先用
free -m了解整体内存状态 - 用
top或ps aux --sort=-%mem找出内存占用大的进程 - 根据进程信息判断是哪个服务
- 针对具体服务做处理和优化
以上就是Linux服务器内存占用接近100%时的排查方法的详细内容,更多关于Linux内存占用接近100%排查的资料请关注脚本之家其它相关文章!
