You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:10:23