Ранее мне говорили, что признаком того, что в некоторых приложениях есть утечка памяти, kernel_task
является большой объем памяти, обычно порядка гигабайт. Если неправильное kext
использование этой памяти приводит к ошибкам, мы ожидаем увидеть расхождение между выделенной памятью и ожидаемой для нее, т.е.
diff <(kextstat|tr -s ' ' | cut -d ' ' -f 5) <(kextstat| tr -s ' ' | cut -d ' ' -f 6)
вернет что-то, кроме слов «Wired» и «Name».
Во время написания моей диссертации я заметил, что изменение PDF, когда оно открыто в Preview, часто приводит к плохим вещам: иногда использование памяти kernel_task
может возрасти примерно до восьми гигабайт или более. Если я убью предпросмотр, он мгновенно возвращается к нормальному состоянию . Так что, очевидно, что-то не так - и в этих условиях Preview теряет память.
Итак, мой вопрос заключается в следующем: если я знаю, что процесс утек оперативной памяти в результате внезапного и неожиданного увеличения площади kernel_task
, почему OS X не может знать, что что-то пошло не так. Если убийственный Preview восстанавливает мою недостающую malloc()
память, почему Дарвин не делает сборку мусора автоматически для меня?
У меня есть фундаментальное недоразумение, как работает управление памятью?
РЕДАКТИРОВАТЬ: (15/9/15)
Вот демонстрация того, о чем я говорю. Прежде всего, я kernel_task
отмечаю высокое использование памяти (обратите внимание, что предварительный просмотр открыт, он виден только в нижней части Activity Monitor, используя 333 МБ оперативной памяти):
Следуя полезным замечаниям Эшли ниже, давайте выясним, сколько использует каждый kext:
$ 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
$
Так что, не огромное количество. Моя машина имеет как дискретные, так и встроенные графические процессоры; их водители используют только несколько МБ проводной памяти. По моему предположению, давайте убьем Preview и посмотрим, что происходит с объемом памяти kernel_task
:
Предварительный просмотр завершен, и объем памяти ядра значительно сократился. До сих пор нет свидетельств изменения в использовании kext: выходные данные вышеупомянутой команды не изменяются.
Изменить : ошибка сообщается как № 22701036. Я все еще жду ответа от Apple. Нет ничего особенно интересного, если вы проверите процесс в ActivityMonitor, но, возможно, я что-то упустил.
kextstat
. Насколько я понимаю, если kext протекает, то выделенные байты и те, которые знает ядро , будут различаться. В данном случае я добавил это, чтобы показать, что у меня нет протекающего текста - так, 2) этого не происходит, когда Preview ест ram. Вместо этого kernel_task
сильно растет. Я постараюсь воссоздать эту проблему и сделать снимок :-).
diff
команда сравнивSize
иWired
столбцы изkextstat
вывода. Я согласен с тем, чтоSize
это «выделенная память», но я не думаю, чтоWired
«ожидается выделение памяти» (man kextstat
описывает это как «Количество проводных байтов памяти ядра, которые занимает kext»). 2) Вы видите несоответствие междуSize
иWired
когда у вас есть проблема с Предварительным просмотром?