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

直接看进程实际用了多少物理内存,别信malloc返回的地址大小;调试malloc本身要绕过glibc 默认行为,否则看到的全是优化后的黑盒。怎么看一个进程真实占用的物理内存(RSS)
malloc分配的是虚拟地址,不等于物理内存占用。真正反映压力的是RSS(Resident Set Size),即当前驻留在物理内存中的页数。ps -o pid,comm,rss,%mem -p
第一次调用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 手册中。