在java中它只是:
Runtime.getRuntime().freeMemory()
如何在C中完成?
答案 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)之前,内存实际上并未从物理内存或交换中分配。当你写它的时候,系统会在找到从哪里获取内存的时候,那就是当你遇到问题的时候。
您最好的选择是使用其他一个答案,告诉您有多少物理内存可用,并且永远不会分配更多。通常较少,因为您将希望为其他进程和内核本身留下一些物理内存。