Java 线上 Linux 服务器怎么通过 free 和 ps 深入分析内存占用分布

舞夢輝影

舞夢輝影

2026-08-02

885人浏览

原创

答案是:free命令的“used”包含应用程序内存和系统缓存,而ps的rss仅统计进程实际占用的物理内存,统计范围不同导致数值差异。

java 线上 linux 服务器怎么通过 free 和 ps 深入分析内存占用分布

别光盯着 free 里那个“used”数字,也别只用 ps 看个 %MEM 就下结论。Java 进程的内存占用分好几块:JVM 堆、非堆(Metaspace、CodeCache、直接内存)、本地线程栈、还有内核缓存。要真正看清分布,得把 freeps 的输出交叉比对,再结合进程内部视角。

free -h 看清系统级真实可用内存

free -h 是起点,但关键字段不是 used,而是 available。这个值代表系统当前能立即分配给新进程的物理内存总量,已自动扣除了内核缓存可回收部分。如果 available 还剩 1G 以上,说明物理内存并不紧张;如果持续低于 200MB,才真该警惕。同时注意 buff/cache 大小——它高是常态,Linux 会主动利用空闲内存做文件缓存,不等于被“占死”。swap usage 如果非零且持续增长,说明物理内存确实不够用了,内核开始换页。

ps aux 找出 Java 进程的 RSS 和 VSZ

运行 ps aux --sort=-%mem | head -10,重点关注 Java 进程的两列:

  • RSS(Resident Set Size):进程当前实际占用的物理内存 KB 数,包含 JVM 堆、非堆、线程栈、JIT 编译代码等所有驻留内存。这是最贴近“真实吃掉多少 RAM”的指标。
  • VSZ(Virtual Memory Size):进程申请的全部虚拟地址空间大小,含 mmap 映射的 jar 包、共享库、未分配的堆预留空间等。它通常远大于 RSS,不能直接反映物理内存压力。

比如一个 Java 进程 RSS 是 1800MB,而你给 JVM 设置了 -Xmx2g,说明堆基本跑满了;但如果 RSS 达到 3.5G,就很可能有堆外内存泄漏(如 DirectByteBuffer、JNI 调用、Log4j2 的异步队列)或线程数暴增。

Java JDK 25
Java JDK 25

Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。

下载

ps -p PID -o 查看单个进程的精细内存项

拿到具体 Java 进程 PID 后,用 ps -p $PID -o pid,rss,vsz,%mem,cmd 定向查看。更进一步,读取 /proc/$PID/status 文件里的几个关键行:

  • VmRSS:和 ps 的 RSS 一致,单位 KB
  • VmSize:和 ps 的 VSZ 一致
  • VmData:进程数据段大小(含 JVM 堆的 committed 部分)
  • VmStk:所有线程栈总和,线程数 × 栈大小(-Xss 默认 1M)

若 VmStk 占比异常高(比如超 500MB),检查是否创建了过多线程;若 VmData 远小于 RSS,说明大量内存来自 DirectMemory 或 native code。

结合 jstat 和 jmap 定位 JVM 内部来源

仅靠系统命令只能看到“外面”,要进 JVM 里看:

  • jstat -gcutil $PID 1000 3 观察老年代使用率和 GC 频次。如果老年代使用率长期 >75% 且频繁 Full GC,堆内存就是瓶颈。
  • jmap -histo:live $PID | sort -k3 -nr | head -20 查看存活对象实例数和占用字节数,快速定位大对象或集合类泄漏。
  • jcmd $PID VM.native_memory summary scale=MB 查看 Metaspace、Compressed Class Space、Direct Buffer 等非堆区域使用量,确认是否是它们撑大了 RSS。

这样一层层剥开,就能区分清楚:是堆内存真爆了?还是 DirectByteBuffer 没释放?或是线程栈吃光了内存?又或者只是 Linux 缓存占了显示空间?

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

3718

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

2752

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

2777

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

635

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

600

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

705

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1268

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

18844

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

646

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

Java 26官方文档
Java 26官方文档

共0课时 | 0人学习