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.
sumber
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?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 :-).Jawaban:
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?
Sumber lain
Wikipedia membahas manajemen memori Mac OS .
Catatan dukungan Apple: Gunakan Activity Monitor untuk membaca memori sistem dan menentukan berapa banyak RAM yang digunakan
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.
sumber
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
kextstat
dan melihat apakah angka-angka dalamSize
kolom 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
kextstat
untuk membuatnya lebih mudah untuk melihat kext mana yang menggunakan paling banyak memori (meskipun perhatikan jenis ini menurutWired
kolom ... ada mantra serupa yang lebih sederhana dalam hal ini) jawab dengan penjelasan jika Anda ingin mengubah ini).sumber
kextstat
. Namun, itu masih tidak tampak seperti itulah yang sebenarnya terjadi: selama gobbling Preview, jejak memoricom.apple.nvidia.driver.*
tidak berubah. Saya telah mengedit pertanyaan saya untuk mencerminkan hal ini.