Wcześniej mówiono mi, że oznaką przecieku pamięci w niektórych aplikacjach jest kernel_task
duży ślad pamięci, zwykle rzędu gigabajtów. Gdyby nieużywanie kext
powodowało takie użycie pamięci, spodziewalibyśmy się rozbieżności między przydzieloną pamięcią a oczekiwanymi do przydzielenia, tj.
diff <(kextstat|tr -s ' ' | cut -d ' ' -f 5) <(kextstat| tr -s ' ' | cut -d ' ' -f 6)
zwróci coś innego niż słowa „Przewodowy” i „Nazwa”.
Podczas pisania mojej pracy zauważyłem, że zmiana pliku pdf, gdy jest on otwarty w Podglądzie, często powoduje złe rzeczy: czasami zużycie pamięci kernel_task
może wzrosnąć do około ośmiu gigabajtów lub więcej. Jeśli zabiję podgląd, natychmiast wraca do normy . Więc oczywiście coś jest nie tak - i w tych warunkach Preview wycieka pamięć.
Więc moje pytanie brzmi: czy ja wiem, że proces wyciekł barana poprzez nagły i nieoczekiwany wzrost śladu kernel_task
, dlaczego nie mogą OS X , że coś poszło nie tak. Jeśli zabicie Preview przywraca moją brakującą malloc()
pamięć, dlaczego Darwin nie robi dla mnie automatycznego usuwania śmieci?
Czy mam fundamentalne nieporozumienie dotyczące sposobu zarządzania pamięcią?
EDYCJA: (15/9/15)
Oto demonstracja tego, o czym mówię. Przede wszystkim zauważam wysokie zużycie pamięci przez kernel_task
(uwaga: Podgląd jest otwarty, tylko widoczny na dole Monitora aktywności, używając 333 MiB pamięci RAM):
Po pomocnych uwagach Ashleya poniżej dowiedzmy się, ile zużywa każdy 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
$
A więc niezbyt duża kwota. Moja maszyna ma zarówno dyskretne, jak i zintegrowane procesory graficzne; ich sterowniki używają tylko kilku MiB przewodowego pamięci RAM. Na moim przeczuciu zabijmy Preview i zobaczmy, co stanie się z odciskiem pamięci kernel_task
:
Podgląd zniknął, a ślad pamięci jądra dramatycznie spadł. Nadal nie ma dowodów na zmianę użycia kext: wynik powyższego polecenia pozostaje niezmieniony.
Edycja : Błąd zgłoszony jako nr 22701036. Nadal czekam na odpowiedź od Apple. Nie ma nic szczególnie interesującego, jeśli obejrzysz proces w ActivityMonitor, ale może coś mi brakuje.
kextstat
. Rozumiem, że jeśli kext przecieka, wówczas przydzielone bajty i te, o których jądro wie, że są przydzielone, będą różne. W tym przypadku umieściłem to, aby pokazać, że nie mam nieszczelnego kext - więc 2) nie dzieje się tak, gdy Preview zjada ram. Zamiast tego kernel_task
dużo rośnie. Spróbuję odtworzyć ten problem i zrobić zdjęcie :-).
diff
polecenie porównuje kolumnySize
iWired
z danychkextstat
wyjściowych. Zgadzam się, żeSize
jest to „przydzielona pamięć”, ale nie sądzę, żeWired
„oczekuje się, że zostanie przydzielona” (man kextstat
opisuje to jako „Liczbę przewodowych bajtów pamięci jądra zajmowanych przez kext”). 2) Czy widzisz rozbieżność pomiędzySize
iWired
kiedy masz problem z podglądem?