Wcześniej mówiono mi, że oznaką przecieku pamięci w niektórych aplikacjach jest kernel_taskduży ślad pamięci, zwykle rzędu gigabajtów. Gdyby nieużywanie kextpowodował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_taskmoż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_taskdużo rośnie. Spróbuję odtworzyć ten problem i zrobić zdjęcie :-).


diffpolecenie porównuje kolumnySizeiWiredz danychkextstatwyjściowych. Zgadzam się, żeSizejest to „przydzielona pamięć”, ale nie sądzę, żeWired„oczekuje się, że zostanie przydzielona” (man kextstatopisuje to jako „Liczbę przewodowych bajtów pamięci jądra zajmowanych przez kext”). 2) Czy widzisz rozbieżność pomiędzySizeiWiredkiedy masz problem z podglądem?