如何在Linux中获取C中的可用内存总大小?

时间:2011-09-12 01:33:26

标签: c linux memory

在java中它只是:

Runtime.getRuntime().freeMemory()

如何在C中完成?

2 个答案:

答案 0 :(得分:5)

您可以使用带有RLIMIT_AS参数的getrlimit()获取linux下进程的虚拟内存限制。

答案 1 :(得分:3)

您的评论似乎表明您真正想知道的是malloc可以在一个块中分配的最大内存。这大约是允许的最大VM大小减去当前VM大小。以下代码返回:

#include <sys/resource.h>
#include <sys/time.h>
#include <stdint.h>

uint64_t get_total_free_mem()
{
    uint64_t vm_size = 0;
    FILE *statm = fopen("/proc/self/statm", "r");
    if (!statm)
        return 0;
    if (fscanf("%ld", &vm_size) != 1)
    {
        flcose(statm);
        return 0;
    }
    vm_size = (vm_size + 1) * 1024;

    rlimit lim;
    if (getrlimit(RLIMIT_AS, &lim) != 0)
        return 0;
    if (lim.rlim_cur <= vm_size)
        return 0;
    if (lim.rlim_cur >= 0xC000000000000000ull) // most systems cannot address more than 48 bits
        lim.rlim_cur  = 0xBFFFFFFFFFFFFFFFull;
    return lim.rlim_cur - vm_size;
}

唯一的例外是在某些情况下getrlimit可以返回0xFFFFFFFFFFFFFFFF但是大多数64位系统无法处理多于48位的地址,无论如何。我已经解释了这一点,但可能还有其他一些我错过的边缘情况。例如,32位应用程序通常不能分配超过3GB的内存,但这取决于内核的构建方式。

这里真正的答案是你想要这样做的原因。通常,malloc可以分配的最大数量远远大于系统实际可以处理的数量。当您调用malloc时,即使没有可用的物理或交换空间,系统也会很乐意分配您要求的任何金额(最多为AS限制,通常是极限)。在程序尝试写入内存(包括写入0)之前,内存实际上并未从物理内存或交换中分配。当你写它的时候,系统会在找到从哪里获取内存的时候,那就是当你遇到问题的时候。

您最好的选择是使用其他一个答案,告诉您有多少物理内存可用,并且永远不会分配更多。通常较少,因为您将希望为其他进程和内核本身留下一些物理内存。