Saya sebelumnya telah diberitahu bahwa tanda bahwa beberapa aplikasi memiliki kebocoran memori adalah yang kernel_task
memiliki jejak memori yang besar, biasanya berdasarkan urutan gigabyte. Jika ada kesalahan kext
yang menyebabkan penggunaan memori ini, kami akan berharap untuk melihat perbedaan antara memori yang dialokasikan dan yang diharapkan akan dialokasikan, yaitu
diff <(kextstat|tr -s ' ' | cut -d ' ' -f 5) <(kextstat| tr -s ' ' | cut -d ' ' -f 6)
akan mengembalikan sesuatu selain kata-kata 'Wired' dan 'Name'.
Saat menulis tesis saya, saya telah memperhatikan bahwa mengubah pdf sementara itu terbuka di Preview sering menyebabkan hal-hal buruk terjadi: kadang-kadang, penggunaan memori kernel_task
dapat tumbuh sekitar delapan gigabyte, atau lebih. Jika saya membunuh pratinjau, itu kembali normal, secara instan . Jadi, jelas ada sesuatu yang salah - dan Pratinjau bocor di bawah kondisi ini.
Jadi, pertanyaan saya adalah ini: jika saya tahu bahwa suatu proses telah bocor ram melalui peningkatan yang tiba-tiba dan tak terduga dari jejak kernel_task
, mengapa OS X tidak tahu bahwa ada yang salah. Jika membunuh Preview mengembalikan malloc()
ingatan saya yang hilang , mengapa Darwin tidak melakukan pengumpulan sampah secara otomatis untuk saya?
Apakah saya memiliki kesalahpahaman mendasar tentang cara kerja manajemen memori?
EDIT: (15/9/15)
Inilah demonstrasi dari apa yang saya bicarakan. Pertama-tama, saya melihat penggunaan memori tinggi kernel_task
(catatan Preview terbuka, hanya terlihat di bagian bawah Activity Monitor, menggunakan 333 MiB ram):
Mengikuti komentar bermanfaat oleh Ashley di bawah ini, mari kita cari tahu seberapa banyak setiap kext menggunakan:
$ 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
$
Jadi, bukan jumlah yang besar. Mesin saya memiliki GPU yang terpisah dan terintegrasi; driver mereka hanya menggunakan beberapa MiB ram kabel. Pada dugaan saya, mari kita bunuh Pratinjau, dan lihat apa yang terjadi pada jejak memori kernel_task
:
Pratinjau hilang, dan jejak memori kernel telah turun secara dramatis. Masih belum ada bukti perubahan penggunaan kext: output dari perintah di atas tidak berubah.
Sunting : Bug dilaporkan sebagai No. 22701036. Saya masih menunggu jawaban dari apel. Tidak ada yang sangat menarik jika Anda memeriksa proses di ActivityMonitor, tapi mungkin saya kehilangan sesuatu.
kextstat
. Pemahaman saya adalah bahwa jika kext bocor, maka byte dialokasikan dan orang-orang yang kernel tahu yang dialokasikan akan berbeda. Dalam hal ini, saya telah menempatkan di sana untuk menunjukkan bahwa saya tidak memiliki kext bocor - jadi, 2) ini tidak terjadi ketika Pratinjau makan ram. Sebaliknya, kernel_task
tumbuh banyak. Saya akan mencoba dan membuat kembali masalah ini dan mengambil gambar :-).
diff
perintah Anda membandingkan kolomSize
danWired
darikextstat
output. Saya setuju bahwaSize
ini "memori yang dialokasikan", tetapi saya tidak berpikirWired
"diharapkan untuk dialokasikan" (man kextstat
menggambarkannya sebagai "Jumlah byte berkabel memori kernel yang ditempati kext"). 2) Apakah Anda melihat perbedaan antaraSize
danWired
ketika Anda memiliki masalah dengan Pratinjau?