Куча обычно равна адресуемой виртуальной памяти в вашей архитектуре.
Вы должны проверить пределы вашей системы с помощью команды ulimit -a
и найти эту строку max memory size (kbytes, -m) 3008828
, эта строка на моемOpenSuse 11.4 x86_64 с ~ 3,5 ГБ ОЗУ говорит, что у меня примерно 3 ГБ ОЗУ на процесс.
Затем вы можете по-настоящему протестировать свою систему, используя эту простую программу, чтобы проверить максимально используемую память на процесс:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char* argv[]){
size_t oneHundredMiB=100*1048576;
size_t maxMemMiB=0;
void *memPointer = NULL;
do{
if(memPointer != NULL){
printf("Max Tested Memory = %zi\n",maxMemMiB);
memset(memPointer,0,maxMemMiB);
free(memPointer);
}
maxMemMiB+=oneHundredMiB;
memPointer=malloc(maxMemMiB);
}while(memPointer != NULL);
printf("Max Usable Memory aprox = %zi\n",maxMemMiB-oneHundredMiB);
return 0;
}
Эта программа получает память с шагом 100 МБ, отображает текущую выделенную память, выделяет 0, затем освобождает память.Когда система не может выделить больше памяти, возвращает NULL и отображает окончательное максимальное полезное количество оперативной памяти.
Предостережение заключается в том, что ваша система начнет сильно менять память на последних этапах.В зависимости от конфигурации вашей системы ядро может решить убить некоторые процессы.Я использую приращения в 100 мегабайт, так что есть место для некоторых приложений и системы.Вы должны закрыть все, что не хотите, чтобы рухнуло.
Это, как говорится.В моей системе, где я пишу это, ничего не зависало.И программа выше сообщает почти так же, как ulimit -a
.Разница заключается в том, что он фактически протестировал память и с помощью memset()
подтвердил, что память была предоставлена и использована.
Для сравнения на виртуальной машине Ubuntu 10.04x86 с 256 МБ ОЗУ и 400 МБ подкачки отчет ulimitбыло memory size (kbytes, -m) unlimited
, и моя маленькая программа выдала 524.288.000 байт, что примерно равно объему оперативной памяти и подкачки, дисконтной памяти, используемой другим программным обеспечением и ядром.
Редактировать: Как писал Адам Залкман, ulimit -m
больше не соблюдается в более новых ядрах Linux 2.6 и выше, так что я исправлен.Но ulimit -v
это честь.Для практических результатов вы должны заменить -m на -v и искать virtual memory (kbytes, -v) 4515440
.Кажется, просто шанс, что мой suse box имеет значение -m, совпадающее с тем, что сообщала моя маленькая утилита.Вы должны помнить, что это виртуальная память, назначаемая ядром, если физической памяти недостаточно, потребуется место подкачки для ее восполнения.
Если вы хотите узнать, сколько физической памяти доступно, не нарушая какой-либо процессили систему, вы можете использовать
long total_available_ram =sysconf(_SC_AVPHYS_PAGES) * sysconf(_SC_PAGESIZE) ;
, это исключит кэш и буферную память, поэтому это число может быть намного меньше, чем фактическая доступная память.Кэши ОС могут быть достаточно большими, и их удаление может дать необходимую дополнительную память, но это обрабатывается ядром.