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 kext
bu 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_task
yaklaşı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_task
nedeninizi 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 :-).
diff
Komutunuzun çıktıdakiSize
veWired
sütunlarını karşılaştırdığını düşünüyorumkextstat
.Size
"Ayrılmış bellek" olduğunu kabul ediyorum , ama "ayrılmasıWired
bekleniyor" olduğunu sanmıyorum (man kextstat
"kext kapladığı çekirdek belleğin kablolu bayt sayısı" olarak açıklar). 2) Önizleme ile ilgili sorun arasındaSize
veWired
ne zaman tutarsızlık olduğunu görüyor musunuz ?