Está forçando um aplicativo a liberar um pouco da memória alocada possível?

5

Desde que voltei ao Firefox há um ano atrás, tenho enfrentado o mesmo problema repetidas vezes - o navegador continua alimentando minha memória. O problema surge de (talvez a suposição incorreta) que uma vez que um usuário fecha uma aba o navegador liberaria a memória alocada para essa aba. Claro Firefox como muitos outros têm algum cache em execução no fundo. Reabrir guias recentemente fechadas também parece ter algo a ver com isso. Portanto, esse lançamento de memória não acontece tão rápido quanto o usuário pode desejar que aconteça.

Eu li em muitos fóruns (incluindo o Mozilla) que, se outro processo requer a memória alocada que o Firefox não precisa agora, o sistema operacional (no meu caso, o Debian Jessie) irá pegar alguns do navegador e entregá-lo outro processo. Sim, isso deve realmente acontecer, mas isso não acontece. O Firefox continua a consumir memória residente e, uma vez que quase desapareceu (como 3.6GB ou mais de 3.8GB), o swap entra em ação. Tudo isso resulta em uma experiência de navegação extremamente dolorosa. Guias de fechamento não adiantam nada. Mesmo quando fecho o Firefox, a memória alocada ainda está lá por algum tempo.

Eu gostaria de saber se é possível forçar o sistema operacional a realocar toda a memória (incluindo swap) que um processo tem usado (mesmo que nenhum outro processo exija essa memória agora), mas agora está fechado.

EDITAR:

Conforme solicitado aqui, o resultado da chamada de free (usou o parâmetro -h para fins de legibilidade) antes e depois do encerramento do Firefox:

Antes:

               total       used       free         shared       buffers        cached

Mem:           3.7G        3.6G       134M         6.8M         5.0M           166M

+/- buffers/cache:         3.4G       306M

Swap           3.7G        2.8G       916M

Depois:

               total       used       free         shared       buffers        cached

Mem:           3.7G        2.9G       856M         4.8M         12.0M          179M

+/- buffers/cache:         2.7G       1.0G

Swap           3.7G        2.7G       998M

Como você pode ver, uma ligeira diminuição é perceptível, mas não é nada comparado com a memória geral usando (residente e swap) até 20-30 minutos depois que o navegador foi fechado. Ao lado do Firefox, não tenho mais nada iniciado, exceto os processos usuais do Debian e alguns applets de painel (clima, CPU + HDD + monitoramento de memória, monitoramento de rede, etc.) que não ocupam muita memória e mal posso notar seus valores com %código%. Tudo o que fiz foi basicamente deixar o navegador aberto o dia inteiro e fechar / abas abertas. Eu tenho que admitir que há um monte de abas na minha sessão, no entanto, quando eu começo (e mais tarde) eu carrego apenas alguns deles. Meu palpite é que, provavelmente, mesmo quando não está carregado com conteúdo, as guias levam muita memória. No entanto, isso não explica por que, depois de fechar o navegador, tenho uma alocação de memória tão alta. Na verdade, é tão alto que às vezes não consigo desligar meu sistema adequadamente e ter que fazer um desligamento a frio.

    
por rbaleksandar 23.01.2016 / 07:51

1 resposta

2

A resposta curta é não: uma vez que um aplicativo tenha alocado memória e usado, ele "pertence" a esse aplicativo e, a menos que o aplicativo o libere, nada mais poderá recuperá-lo. (Isso não é tão simples quanto uma chamada para free() , já que isso apenas retorna a memória para o pool do aplicativo individual, não para o sistema.)

O swap deve ajudar com isso: uma vez que a memória física esteja cheia, o sistema operacional pode mover páginas de memória raramente usadas para trocar. Se o conjunto de trabalho real é maior que a memória física, isso apenas resulta em uma surra: a memória é movida para troca e recuo o tempo todo, e o sistema não pode fazer nada útil.

No Linux como último recurso, o invasor da OOM entrará e eliminará processos para recuperar sua memória.

É estranho que você não veja a memória recuperada assim que o Firefox parar; talvez o processo do Firefox esteja demorando um pouco para ser encerrado, depois que sua janela acabar (verifique com ps ou seu gerenciador de tarefas). Quando um processo é interrompido, toda a memória alocada é liberada e fica disponível para outras pessoas.

    
por 23.01.2016 / 13:55