答案1
对我来说,这在 Linux 上是完全正常的行为,这称为内存过量使用。但是,如果您担心系统的健康状况,或者您觉得性能不佳,您可以使用以下命令检查哪些进程消耗了最多的虚拟内存:
ps aux | head -1; ps aux | sort -rnk 5
过一段时间再执行此命令并比较结果。您可能会发现在此期间有几个进程消耗了大量内存。
然后你可以使用以下方法检查这些进程的内存布局地图效用或/进程目录:
➜ ~ sudo cat /proc/2095/maps
c000000000-c000600000 rw-p 00000000 00:00 0
c000600000-c001200000 rw-p 00000000 00:00 0
c001200000-c004000000 rw-p 00000000 00:00 0
55ee50165000-55ee51972000 r--p 00000000 fd:01 11799696 /usr/bin/dockerd
55ee51972000-55ee535be000 r-xp 0180d000 fd:01 11799696 /usr/bin/dockerd
55ee535be000-55ee5392f000 r--p 03459000 fd:01 11799696 /usr/bin/dockerd
55ee53930000-55ee54f5d000 r--p 037ca000 fd:01 11799696 /usr/bin/dockerd
55ee54f5d000-55ee54ffd000 rw-p 04df7000 fd:01 11799696 /usr/bin/dockerd
55ee54ffd000-55ee55045000 rw-p 00000000 00:00 0
55ee568ad000-55ee568ce000 rw-p 00000000 00:00 0 [heap]
保存目标进程的内存布局,然后过一段时间再检查并比较结果。如果某个堆或堆栈的起始/结束地址,或其他内存区域发生显著变化,您可能会找到您正在寻找的内存。
PS 我确实通过这种方式在我的 C++ APP 中发现了泄漏:我没有正确释放用于解析的 JSON 库的资源,因此其中一个内存区域不断增长。