C - 检查当前可用的空闲 RAM?

标签 c memory-management memory-leaks malloc c99

我知道如何使用 malloc()free() 来分配内存,但是是否还有一个标准的 C 函数来检查剩余的内存量,所以我可以定期调用它以确保我的代码没有内存泄漏吗?

我唯一能想到的就是在无限循环中调用malloc(1) 直到它返回一个错误,但是难道没有更有效的方法吗?

最佳答案

Linux glibc sysconf(_SC_AVPHYS_PAGES)get_avphys_pages()

这两个 glibc 扩展应该给你可用的页数。然后我们可以将它乘以页面大小 sysconf(_SC_PAGESIZE) 以找到以字节为单位的总可用内存。

主.c

#define _GNU_SOURCE
#include <stdio.h>
#include <sys/sysinfo.h>
#include <unistd.h>

int main(void) {
    /* PAGESIZE is POSIX: http://pubs.opengroup.org/onlinepubs/9699919799/
     * but PHYS_PAGES and AVPHYS_PAGES are glibc extensions. I bet those are
     * parsed from /proc/meminfo. */
    printf(
        "sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE) = 0x%lX\n",
        sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE)
    );
    printf(
        "sysconf(_SC_AVPHYS_PAGES) * sysconf(_SC_PAGESIZE) = 0x%lX\n",
        sysconf(_SC_AVPHYS_PAGES) * sysconf(_SC_PAGESIZE)
    );

    /* glibc extensions. man says they are parsed from /proc/meminfo. */
    printf(
        "get_phys_pages() * sysconf(_SC_PAGESIZE) = 0x%lX\n",
        get_phys_pages() * sysconf(_SC_PAGESIZE)
    );
    printf(
        "get_avphys_pages() * sysconf(_SC_PAGESIZE) = 0x%lX\n",
        get_avphys_pages() * sysconf(_SC_PAGESIZE)
    );
}

GitHub upstream .

编译运行:

gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out

我的 32GiB RAM 系统上的示例输出:

sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE) = 0x7CCFFC000
sysconf(_SC_AVPHYS_PAGES) * sysconf(_SC_PAGESIZE) = 0x6383FD000
get_phys_pages() * sysconf(_SC_PAGESIZE) = 0x7CCFFC000
get_avphys_pages() * sysconf(_SC_PAGESIZE) = 0x6383FD000

0x7CCFFC000 比 32GiB 小一点,是总 RAM。 0x6383FD000 是可用的。

man get_avphys_pages 说它从 /proc/meminfo 获取数据。

在 Ubuntu 19.04 中测试。

关于C - 检查当前可用的空闲 RAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14386856/

相关文章:

c# - String 和 Char 类型如何存储在 .NET 的内存中?

c - Visual Studio 2017 不支持C11 新特性_Generic

C LibPCRE TRUE/FALSE 问题

java - 为什么 boolean 值在数组中占用的内存更少?

javascript - IE10 setInterval 内存泄漏的解决方法

ios - 不使用 ImagePickerController 获取图像

c - 这段代码中的 XS 内存泄漏?

c - 可变参数在多次转发时如何在堆栈上表示?

c - 如何转换字符串以便可以将字符串读取为十六进制值?

c - 使用自定义分配实现分配内存时出现段错误;适用于除 8 字节以外的所有大小