linux系统top查看进程占用内存不高,但是操作系统内存不知去哪了

这是一个陷阱。
不要相信 top 命令的内存使用情况。
不用这样做,只需查看 top 命令即可。
要查看这一点,请使用 free 命令和 /proc 文件系统。

查看Linux系统进程内存占用情况

说实话,当我第一次接手服务器时,我使用 Linux 查看进程内存使用情况,非常头疼。
我记得我的系统第一次死机的时候。
不仅CPU满了,内存也低了。
我急于尝试各种命令。
即使现在想起来,也真的很可笑。

首先我们来说说top命令。
这真的很方便。
当您按下终端顶部时,您将立即看到有关多个进程的信息。
最值得注意的一列是 %MEM 列。
让我举个例子。
有一次,我们公司的网络服务器突然响应变得非常慢。
当我向 Top 查询时,这是一个没人知道的 Python 进程,但 %MEM 却飙升了 7 0% 以上。
这种情况下top的优势就是实时性强。
如果你仔细观察,你一眼就能看出哪些进程正在使用大量内存。
缺点是它并不总是为您提供最详细的数字,例如特定进程正在使用多少内存段,因此您必须使用其他命令。

说起pmap,这个命令真是详细。
我有经验。
例如,如果您使用 ps aux 查找像 1 2 3 4 这样的特定进程号,然后快速打开一个新终端并输入 pmap -d 1 2 3 4 ,您得到的将是非常具体的。
可以检查进程的内存映射,哪些块是代码,哪些块是数据,哪些块是共享库。
我记得在调试 Java 应用程序时无法弄清楚 JVM 内存模型。
我只是使用 pmap 进行了研究,它立即对我有意义。
然而,pmap 有一个陷阱。
这意味着输出的信息相当混乱,初学者可能需要一段时间才能理解。
不要忘记检查您的数据。
上次看一些系统进程,pmap显示的内存数量和top不一样。
检查内核参数后,我意识到匿名映射可能包含一些内存。
这需要一些背景知识。

最后说一下ps。
该命令用途广泛,使用起来最灵活。
例如,您可以键入 ps -e 查看整个系统上的所有进程,包括隐藏进程。
在排查 SQL 缓慢问题时,我想查看哪个进程以数据库用户身份运行,因此我使用 ps -e -o 'pid,comm,rsz,vsz,user' 发现查询进程的 rsz(真实内存)有数亿千字节。
后来我就用这个方法来解决问题。
ps 最好的一点是 ps -e -o 'pid,comm,rsz' | java | grep | sort -nrk3 可以直接将所有Java进程按照物理内存从大到小排序。
但请注意sort的-n和-r必须正确使用。
上次成绩差点被翻盘,我满头大汗。

老实说,如果你熟悉这三个命令,内存占用基本上是够用的。
不过,每个命令都有不同的侧重点,因此请根据您的情况进行选择。
例如,如果你急需,你可以使用top,如果你想彻底检查,你可以使用pmap,如果你想做统计或复杂的过滤,你可以使用ps。
我希望这个经验对你有帮助。