Foi-me dito anteriormente que um sinal de que algum aplicativo tem um vazamento de memória é que kernel_taskpossui um grande espaço de memória, geralmente da ordem de gigabytes. Se um erro kextestivesse 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_taskpode 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_taskcresce muito. Vou tentar recriar esse problema e tirar uma foto :-).


diffcomando está comparando as colunasSizeeWireddakextstatsaída. Concordo queSizeseja "memória alocada", mas não acho queWired"seja alocado" (aman kextstatdescreve como "O número de bytes com fio da memória do kernel que o kext ocupa"). 2) Você está vendo a discrepância entreSizeeWiredquando tem o problema com a Visualização?