linux 如何查看进程 linux查看进程内存使用率命令

圆圆 0 2026-05-23 14:01:46

应查看RSS(Resident Set Size)和malloc返回值,因RSS占用进程实际占用的物理内存;ps、pmap、/proc/pid/statm渴望占用RSS,其中pmap -x第三列RSS加总即为总物理内存占用。

如何在linux中查看进程的内存分配情况 linux使用malloc调试的方法

直接看进程实际用了多少物理内存,别信malloc返回的地址大小;调试malloc本身要绕过glibc 默认行为,否则看到的全是优化后的黑盒。怎么看一个进程真实占用的物理内存(RSS)

malloc分配的是虚拟地址,不等于物理内存占用。真正反映压力的是RSS(Resident Set Size),即当前驻留在物理内存中的页数。ps -o pid,comm,rss,%mem -p :快速查单个进程的RSS和内存队列pmap -x :列出所有内存映射段,第三列 RSS 是关键,加总就是该进程实际占用的物理内存cat /proc//statm:输出 7 个数字,第二个是 RSS 页数(需×4096 换算为字节注意):top 中的 RES 列和 ps 的 RSS 是同一指标,但 VIRT 包含未分配/未触碰的 mmap 区域,不能反映真实压力为什么 malloc(20)却看到brk增加了132KB

第一次调用malloc时,glibc会通过brk向内核申请块内存(如135168字节),并不是底层分配。这是为了减少系统调用开销。原因:glibc的ptmalloc使用sbrk预分配一个“分配区”(main arena),最小单位受MMAP_THRESHOLD 和对齐规则影响 132KB 不是幻数:它由头部头部(32 字节)、对齐到页面边界(4096 字节)及默认 TOP_PAD 共同决定后续小 malloc(如再申请 20 字节)通常从这块预分配内存中切分,不再触发 brk 验证方式:用 strace -e brk,mmap ./your_program 可优先第一次 brk 调用的实际增量如何让 malloc 行为“可观察”,避免优化干扰

默认glibc对小内存使用fastbins、tcache等优化,导致多次malloc/free看不到归内存还——这不是bug,是设计使然。要调试真实分配/释放行为,必须关闭缓存。Docker Desktop(linux)

当前Docker最新稳定版本之一,主要针对稳定性和兼容性进行了修复优化,适合生产环境与日常开发使用。

该版本继续强化AI开发支持、容器日志管理以及Docker Engine的安全能力,对Windows/macOS/Linux平台兼容性进行了进一步优化。下载环境变量:MALLOC_TRIM_THRESHOLD_=0 MALLOC_TOP_PAD_=0 MALLOC_MMAP_THRESHOLD_=0,强制取消tcache和mmap回退支持malloc_trim(0)主动收缩堆顶,观察brk是否落回(返回1) 表示成功)启用调试检查:MALLOC_CHECK_=2,会在检测到double-free、越界写时中止并打印错误,但会明显拖慢运行速度注意:MALLOC_CHECK_在生产环境取消,仅用于开发期定位问题调试malloc源码本身需要替换libc

想单导入malloc函数内部?系统自带的libc.so是编译优化过的,没有调试符号。必须自己编译带--enable-debug 先确认版本:ldd --version 或 getconf GNU_LIBC_VERSION 下载对应源码(如 glibc-2.39),configure --prefix=/usr --enable-debug=yes,然后让运行时用 LD_PRELOAD=/path/to/build/libc.so ./your_program 加载自定义 libc 用 gdb --args ./your_program 启动后,break malloc 可以停在源码行;但注意:某些系统调用(如 brk)仍需 catch syscall brk 捕获坑点:自定义 libc 与系统动态链接器(ld-linux-x86-64.so.2)版本不匹配会导致分段错误,一定用同源构建出的 ld

真正难的不是看到 malloc 分配了多少,反而明白为什么这样分——比如 tcache 如何丢失内存泄漏、brk 和 mmap 的切换阈值在哪、malloc_trim 有时为何返回 0。这些细节隐藏在 malloc.c 的注释和 malloc_stats() 输出里,而不是 man 手册中。

上一篇:mac系统占了100多g什么原因 mac系统占很大内存
下一篇:返回列表
相关文章
返回顶部小火箭