getrusage函数ru_maxrss字段无法降低?实时内存监控方案咨询
关于getrusage监控内存的问题与解答
认知纠正
首先明确:ru_maxrss字段记录的是进程自启动以来的最大驻留集大小(RSS),它只会保存峰值,不会随着内存释放而降低,这是该字段的设计特性,并非功能异常。
另外你的测试代码里,malloc分配内存后没有对内存进行写入操作,Linux的写时复制(COW)机制会延迟实际物理内存的分配,所以即使调用了malloc,进程实际占用的物理内存并没有增加,这也是输出中分配内存前后数值不变的原因。
测试代码与输出
测试代码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/time.h> #include <sys/resource.h> int main() { struct rusage usage; getrusage(RUSAGE_SELF, &usage); printf("Before allocating memory:Memory usage: %ld KB\n", usage.ru_maxrss); sleep(1); int *arr =malloc(sizeof(int)*1024*8*1024); // 补充写入操作,触发物理内存分配 for (int i = 0; i < 1024*8*1024; i++) { arr[i] = i; } getrusage(RUSAGE_SELF, &usage); printf("After allocating memory:Memory usage: %ld KB\n", usage.ru_maxrss); sleep(1); free(arr); getrusage(RUSAGE_SELF, &usage); printf("After release:Memory usage: %ld KB\n", usage.ru_maxrss); return 0; }
修正后预期输出(示例)
Before allocating memory: Memory usage: 2592 KB After allocating memory: Memory usage: 57344 KB After release:Memory usage: 57344 KB
可以看到,分配并写入内存后,ru_maxrss会更新到峰值,释放内存后依然保持最大值。
实时监控当前内存使用的方法
如果需要获取进程实时的当前内存占用,而非峰值,可以通过以下方式实现:
- 读取
/proc/self/statm文件:该文件包含进程内存使用的统计信息,其中第二个数值就是当前RSS(单位是页,需要乘以系统页大小,通常是4KB)。 - 读取
/proc/self/status文件:其中VmRSS字段直接给出当前驻留内存大小(带单位)。
示例代码(读取/proc/self/status获取当前RSS):
#include <stdio.h> #include <stdlib.h> #include <string.h> long get_current_rss() { FILE* file = fopen("/proc/self/status", "r"); if (!file) { perror("fopen failed"); return -1; } char line[256]; long rss = 0; while (fgets(line, sizeof(line), file)) { if (strncmp(line, "VmRSS:", 6) == 0) { sscanf(line, "VmRSS: %ld kB", &rss); break; } } fclose(file); return rss; } int main() { printf("Before allocating memory:Current Memory usage: %ld KB\n", get_current_rss()); sleep(1); int *arr = malloc(sizeof(int)*1024*8*1024); for (int i = 0; i < 1024*8*1024; i++) { arr[i] = i; } printf("After allocating memory:Current Memory usage: %ld KB\n", get_current_rss()); sleep(1); free(arr); printf("After release:Current Memory usage: %ld KB\n", get_current_rss()); return 0; }
该代码可以实时获取进程当前的驻留内存大小,释放内存后数值会相应降低(具体降低幅度取决于操作系统的内存回收策略)。
内容的提问来源于stack exchange,提问作者herb justin
相关产品推荐
相关产品推荐

