Mengapa memori yang bocor muncul malloced ke kernel_task, dan mengapa OS X tidak dapat mengumpulkannya


11

Saya sebelumnya telah diberitahu bahwa tanda bahwa beberapa aplikasi memiliki kebocoran memori adalah yang kernel_taskmemiliki jejak memori yang besar, biasanya berdasarkan urutan gigabyte. Jika ada kesalahan kextyang 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_taskdapat 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):

Penggunaan memori kernel tinggi

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:

Membunuh pratinjau membantu berbagai hal

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.


Saya bingung tentang dua hal - dapatkah Anda mengklarifikasi? 1) Saya pikir diffperintah Anda membandingkan kolom Sizedan Wireddari kextstatoutput. Saya setuju bahwa Sizeini "memori yang dialokasikan", tetapi saya tidak berpikir Wired"diharapkan untuk dialokasikan" ( man kextstatmenggambarkannya sebagai "Jumlah byte berkabel memori kernel yang ditempati kext"). 2) Apakah Anda melihat perbedaan antara Sizedan Wiredketika Anda memiliki masalah dengan Pratinjau?
Ashley

1) Anda benar - Saya membandingkan elemen dalam Ukuran dan Kabel dari 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_tasktumbuh banyak. Saya akan mencoba dan membuat kembali masalah ini dan mengambil gambar :-).
Landak

Terima kasih! Tunggu sebentar: Saya hanya menulis jawaban yang mungkin bisa membantu.
Ashley

Jawaban:


6

The inti dari OS X tidak sampah yang dikumpulkan; Libibern C ++ Runtime dari IOKit mengharuskan pengembang untuk mengelola memori mereka sendiri.

Manajemen Memori Mac

Dari Bagaimana cara kerja manajemen memori di Mac OS X?

Apple mendokumentasikan level terendah Kernel Mach dan subsistem memori virtual dengan cukup baik di web sebagai bagian dari dokumentasi pengembangnya.

Karena kernel itu dikembangkan oleh Carnegie Mellon University , Anda dapat menemukan lusinan makalah yang menggambarkannya dengan mudah.

Sumber lain

Pengumpulan Sampah

Pengumpulan sampah ada di lapisan pengguna atau aplikasi. Bahkan pada lapisan ini, pengumpulan sampah hanya membantu jika aplikasi telah merilis semua klaim ke memori. Ketergantungan melingkar dapat mengalahkan pengumpulan sampah. Pengumpulan sampah itu sendiri adalah bidang penelitian yang berkembang dan sulit untuk diperbaiki .

Laporkan Bug dan Kebocoran Memori

Bug dalam OS X akan membocorkan memori. Mengingat ukuran basis kode, ini hampir pasti.

Silakan laporkan bug yang dapat direproduksi langsung ke Apple . Setiap laporan bug membantu dan mungkin contoh Anda akan menjadi satu-satunya yang membantu insinyur Apple menemukan penyebabnya.


Ini mengecewakan, tetapi tidak diragukan lagi benar. Saya telah melaporkan bug ke Apple - Saya merasa menjengkelkan!
Landak

2
Tolong bisakah Anda membagikan nomor bug sebagai pengeditan untuk pertanyaan Anda. Orang lain yang menemukan pertanyaan Anda bermanfaat kemudian dapat mengajukan bug duplikat yang mencatat dokumen asli Anda. Setumpuk bug terkait akan membantu membenarkan lebih banyak waktu rekayasa.
Graham Miln

4

Inilah tebakan saya, dengan asumsi Mac Anda memiliki GPU terintegrasi (mis. Intel Iris Graphics).

Ketika tesis Anda terbuka di Pratinjau, memori kartu grafis digunakan untuk menahan gambar ("tekstur") dari jendela Pratinjau, dan mungkin juga beberapa halaman di luar layar tapi diterjemahkan dari tesis.

Dengan kartu grafis terintegrasi, memori video sebenarnya (sebagian?) Terletak di RAM sistem, yang dibagi antara CPU dan GPU. Pada beberapa kartu grafis terintegrasi, jumlah RAM sistem yang digunakan dialokasikan secara dinamis (lihat Apple HT204349 ).

Saya kira Anda sesekali melihat bug pada driver kartu grafis dan / atau Pratinjau, yang tidak melepaskan memori sistem dengan benar ketika Pratinjau memuat ulang PDF tesis Anda. (Namun bug ini dimitigasi oleh OS X / driver dengan benar melepaskan memori ketika Pratinjau berhenti.)

Anda dapat mencoba melihat output kextstatdan melihat apakah angka-angka dalam Sizekolom meningkat ketika Anda mengalami masalah. Teori saya adalah bahwa peningkatan 8GB yang Anda sebutkan akan disebabkan oleh driver kartu grafis.

Perintah berikut (dari komentar pada jawaban terkait dan menarik ini ) mengurutkan output kextstatuntuk membuatnya lebih mudah untuk melihat kext mana yang menggunakan paling banyak memori (meskipun perhatikan jenis ini menurut Wiredkolom ... ada mantra serupa yang lebih sederhana dalam hal ini) jawab dengan penjelasan jika Anda ingin mengubah ini).

kextstat | awk 'NR==1{ printf "%10s %s\n", $5, $6; } NR!=1{ printf "%10d %s\n", $5, $6; }' | sort -n

Tebakan yang bagus - dan terima kasih banyak untuk hasil yang berguna dan diurutkan dari kextstat. Namun, itu masih tidak tampak seperti itulah yang sebenarnya terjadi: selama gobbling Preview, jejak memori com.apple.nvidia.driver.*tidak berubah. Saya telah mengedit pertanyaan saya untuk mencerminkan hal ini.
Landak
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.