Daha önce, bazı uygulamaların bellek sızıntısı olduğuna dair bir işaretin kernel_task, genellikle gigabayt sırasına göre geniş bir bellek alanına sahip olduğu söylendi . Bir ters Eğer kextbu bellek kullanımını neden oldu, biz ayrılan bellek ve tahsis edilmesi bekleniyor olanlar, yani arasında bir tutarsızlık görmeyi bekleriz
diff <(kextstat|tr -s ' ' | cut -d ' ' -f 5) <(kextstat| tr -s ' ' | cut -d ' ' -f 6)
"Kablolu" ve "Ad" sözcüklerinden başka bir şey döndürür.
Tezimi yazarken, Önizleme'de açıkken bir pdf değiştirmenin çoğu zaman kötü şeylerin gerçekleşmesine neden olduğunu fark ettim: zaman zaman, bellek kullanımının kernel_taskyaklaşık sekiz gigabayta veya daha fazlasına çıkabileceğini. Önizlemeyi öldürürsem, anında normale döner . Açıkçası, bir şeyler yanlış - ve Önizleme bu koşullar altında bellek sızdırıyor.
Yani, sorum şu: eğer ben bir süreçtir ait ayak izi ani ve beklenmedik artış yoluyla koç sızdırılmış olduğunu biliyor kernel_tasknedeninizi OS X bir şeyin gitmiş yanlış olduğunu biliyorum. Önizleme öldürme benim eksik geri gelmesini malloc()d hafızası', neden vermez Darwin benim için automagicallylar çöp toplama mı?
Bellek yönetiminin nasıl çalıştığı hakkında temel bir yanlış anlama var mı?
DÜZENLEME: (15/9/15)
İşte neden bahsettiğimi gösteren bir gösteri. Her şeyden önce, yüksek bellek kullanımını fark ediyorum kernel_task(333 MiB ram kullanarak, Etkinlik Monitörünün altında görülebilir, Önizleme açıktır):
Aşağıdaki Ashley tarafından yapılan faydalı açıklamalardan sonra, her bir kext'in ne kadar kullandığını öğrenelim:
$ 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
$
Yani, büyük bir miktar değil. Makinemde hem ayrık hem de entegre GPU'lar var; sürücüleri sadece birkaç MiB kablolu koç kullanıyor. Önsezimde, Önizlemeyi öldürelim ve şunların bellek ayak izine ne olduğuna bakalım kernel_task:
Önizleme gitti ve çekirdeğin bellek ayak izi önemli ölçüde azaldı. Kext kullanımında bir değişiklik olduğuna dair hala bir kanıt yok: yukarıdaki komutun çıktısı değişmedi.
Düzenleme : Hata No. 22701036 olarak bildirdi. Hala elma bir yanıt bekliyorum. ActivityMonitor'daki süreci incelerseniz özellikle ilginç bir şey yok, ama belki bir şey eksik.
kextstat. Anladığım kadarıyla bir kext sızıyorsa, tahsis edilen baytlar ve çekirdeğin tahsis edildiğini bildikleri farklı olacaktır. Bu durumda, oraya sızdıran bir ipucum olmadığını göstermek için koydum - bu yüzden, 2) Önizleme koç yendiğinde bu gerçekleşmez. Bunun yerine, kernel_taskçok büyür. Bu sorunu yeniden oluşturmaya ve bir resim çekmeye çalışacağım :-).


diffKomutunuzun çıktıdakiSizeveWiredsütunlarını karşılaştırdığını düşünüyorumkextstat.Size"Ayrılmış bellek" olduğunu kabul ediyorum , ama "ayrılmasıWiredbekleniyor" olduğunu sanmıyorum (man kextstat"kext kapladığı çekirdek belleğin kablolu bayt sayısı" olarak açıklar). 2) Önizleme ile ilgili sorun arasındaSizeveWiredne zaman tutarsızlık olduğunu görüyor musunuz ?