Foi-me dito anteriormente que um sinal de que algum aplicativo tem um vazamento de memória é que kernel_task
possui um grande espaço de memória, geralmente da ordem de gigabytes. Se um erro kext
estivesse causando esse uso de memória, esperaríamos ver uma discrepância entre a memória alocada e a que seria esperada, ou seja,
diff <(kextstat|tr -s ' ' | cut -d ' ' -f 5) <(kextstat| tr -s ' ' | cut -d ' ' -f 6)
retornaria algo diferente das palavras 'Wired' e 'Name'.
Enquanto escrevia minha tese, notei que alterar um pdf enquanto ele está aberto no Preview geralmente causa coisas ruins: ocasionalmente, o uso de memória kernel_task
pode aumentar para cerca de oito gigabytes ou mais. Se eu matar a visualização, ela voltará ao normal instantaneamente . Então, obviamente, algo está errado - e o Preview está vazando memória nessas condições.
Portanto, minha pergunta é a seguinte: se eu sei que um processo vazou de memória RAM através de um aumento repentino e inesperado na área de cobertura kernel_task
, por que o OS X não pode saber que algo deu errado? Se matar o Preview restaura minha malloc()
memória perdida , por que Darwin não faz a coleta de lixo automaticamente para mim?
Tenho um mal-entendido fundamental de como o gerenciamento de memória funciona?
EDIT: (15/9/15)
Aqui está uma demonstração do que estou falando. Antes de tudo, noto alto uso de memória kernel_task
(observe que a visualização está aberta, visível apenas na parte inferior do Activity Monitor, usando 333 MiB de memória ram):
Seguindo as observações úteis de Ashley abaixo, vamos descobrir quanto cada kext está usando:
$ kextstat | awk 'NR==1{ printf "%10s %s\n", $5, $6; } NR!=1{ printf "%10d %s\n", $5, $6; }' | sort -n
...
...
...
1249280 com.apple.driver.DspFuncLib
1769472 com.apple.nvidia.driver.NVDAGK100Hal
2629632 com.apple.nvidia.driver.NVDAResman
6184960 com.apple.driver.AirPort.Brcm4360
$
Então, não é uma quantidade enorme. Minha máquina possui GPUs discretas e integradas; seus drivers estão usando apenas alguns MiB de ram com fio. No meu palpite, vamos matar o Preview e ver o que acontece com a pegada de memória de kernel_task
:
A visualização sumiu e a pegada de memória do kernel caiu drasticamente. Ainda não há evidência de uma alteração no uso do kext: a saída do comando acima é inalterada.
Edit : Bug relatado como No. 22701036. Ainda estou esperando por uma resposta da apple. Não há nada particularmente interessante se você inspecionar o processo no ActivityMonitor, mas talvez esteja faltando alguma coisa.
kextstat
. Meu entendimento é que, se um kext estiver vazando, os bytes alocados e os que o kernel sabe que estão alocados serão diferentes. Nesse caso, coloquei isso lá para mostrar que não tenho um kext com vazamento - então, 2) isso não ocorre quando o Preview come carneiro. Em vez disso, kernel_task
cresce muito. Vou tentar recriar esse problema e tirar uma foto :-).
diff
comando está comparando as colunasSize
eWired
dakextstat
saída. Concordo queSize
seja "memória alocada", mas não acho queWired
"seja alocado" (aman kextstat
descreve como "O número de bytes com fio da memória do kernel que o kext ocupa"). 2) Você está vendo a discrepância entreSize
eWired
quando tem o problema com a Visualização?