Pergunta

Meu aplicativo semelhante ao programa hypotetical:

for(;;) {
  for (i=0; i<1000; i++) {
    p[i] = malloc(random_number_between_1000_and_100000());
    p[i][0]=0;  // update
   }
  for (i=0; i<1000; i++) {
    free(p[i]);
  }
}

Não tem vazamentos de memória, mas no meu sistema, o consumo de memória (em cima, VSS coluna) cresce sem limites (tais como 300% de memória física disponível). Isso é normal?

Atualização - usar a memória para um tempo e depois libertá-la. Será esta uma diferença?

Foi útil?

Solução

Tente adicionar

  sbrk(-1);

no final de cada ciclo para ver se faz diferença.

A livre () somente desaloca memória, mas ele não dá-lo de volta para o OS.

Outras dicas

O comportamento é normal. Citando man 3 malloc:

Bugs

Por padrão, o Linux segue uma estratégia de alocação de memória otimista. Isto significa que quando malloc () retorna não-NULL não há nenhuma garantia de que o memória está realmente disponível. Este é realmente um mau bug. No caso de se verificar que o sistema está sem memória, uma ou mais processos serão morto pelo assassino OOM infame. No caso do Linux é usado em circunstâncias onde seria menos desejável, de repente, perder algum aleatoriamente processos escolhido, e além disso a versão do kernel é suficientemente recente, pode-se desligar este comportamento overcommitting usando um comando como:

       # echo 2 > /proc/sys/vm/overcommit_memory

Veja também o diretório Documentação kernel, arquivos vm / overcommit-contábeis e sysctl / vm.txt.

Você precisa tocar (leitura / gravação) a memória do kernel do Linux para realmente reservá-lo.

O sistema operacional geralmente aloca todas as páginas como Copy-on-write clones do "0" página, que é uma página fixo preenchido com zeros. Leitura das páginas irá retornar 0 como esperado. Contanto que você apenas lê, todas as referências ir o a mesma memória física. Uma vez que você escrever um valor de "vaca" é quebrada e um real, física, quadro de página é alocado para você. este meios que, enquanto você não escreve para a memória que você pode manter alocação de memória até que o espaço de endereço de memória virtual se esgotar ou sua mesa página enche toda a memória disponível.

Enquanto você não tocar esses pedaços alocados o sistema realmente não vai alocá-los para você.
No entanto, você pode ficar sem espaço endereçável que é um limite imposta pelo sistema operacional para os processos, e não é necessariamente o máximo que você pode abordar com o tipo de ponteiro sistemas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top