ก่อนหน้านี้ฉันได้รับแจ้งว่ามีสัญญาณว่าบางแอปพลิเคชันมีหน่วยความจำรั่วนั่นคือkernel_task
มีหน่วยความจำขนาดใหญ่ตามลำดับหน่วยเป็นกิกะไบต์ หากมีข้อผิดพลาดkext
ทำให้การใช้งานหน่วยความจำนี้เราคาดว่าจะเห็นความแตกต่างระหว่างหน่วยความจำที่จัดสรรและที่คาดว่าจะได้รับการจัดสรรคือ
diff <(kextstat|tr -s ' ' | cut -d ' ' -f 5) <(kextstat| tr -s ' ' | cut -d ' ' -f 6)
จะส่งคืนสิ่งอื่นนอกเหนือจากคำว่า 'Wired' และ 'Name'
ในขณะที่เขียนวิทยานิพนธ์ของฉันฉันสังเกตเห็นว่าการเปลี่ยนไฟล์ PDF ในขณะที่เปิดอยู่ในหน้าตัวอย่างมักจะทำให้สิ่งเลวร้ายเกิดขึ้น: บางครั้งการใช้หน่วยความจำของkernel_task
สามารถเติบโตถึงประมาณแปดกิกะไบต์หรือมากกว่า ถ้าฉันฆ่าภาพตัวอย่างก็จะกลับสู่ปกติได้ทันที เห็นได้ชัดว่ามีบางอย่างผิดปกติและพรีวิวกำลังรั่วหน่วยความจำภายใต้เงื่อนไขเหล่านี้
ดังนั้นคำถามของฉันคือ: ถ้าฉันรู้ว่ากระบวนการรั่ว ram ผ่านการเพิ่มขึ้นอย่างกะทันหันและคาดไม่ถึงkernel_task
ทำไมOS Xจึงไม่สามารถรู้ได้ว่ามีบางอย่างผิดปกติ ถ้าฆ่าดูตัวอย่างเรียกคืนของฉันหายไปmalloc()
'd หน่วยความจำทำไมไม่ดาร์วินทำเก็บขยะโดยอัตโนมัติสำหรับฉันหรือไม่
ฉันมีความเข้าใจผิดพื้นฐานเกี่ยวกับการจัดการหน่วยความจำหรือไม่
แก้ไข: (15/9/15)
นี่คือการสาธิตสิ่งที่ฉันพูดถึง ก่อนอื่นฉันสังเกตเห็นการใช้หน่วยความจำสูงด้วยkernel_task
(หมายเหตุเปิดตัวอย่างอยู่ที่ด้านล่างของ Activity Monitor โดยใช้ ram 333 MiB):
ทำตามคำพูดที่เป็นประโยชน์โดยแอชลีย์ด้านล่างเรามาดูกันว่า kext แต่ละตัวใช้งานอะไรกัน:
$ 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
$
ดังนั้นไม่ใช่จำนวนมาก เครื่องของฉันมีทั้ง GPU แยกและรวม ไดรเวอร์ของพวกเขาใช้เพียง RAM MiB เพียงไม่กี่สาย ในลางสังหรณ์ของฉันลองมาดูตัวอย่างและดูว่าเกิดอะไรขึ้นกับรอยความทรงจำของkernel_task
:
หน้าตัวอย่างหายไปและรอยความทรงจำของเคอร์เนลลดลงอย่างมาก ยังไม่มีหลักฐานการเปลี่ยนแปลงการใช้งาน kext: ผลลัพธ์ของคำสั่งด้านบนไม่เปลี่ยนแปลง
แก้ไข : รายงานข้อผิดพลาดเป็นหมายเลข 22701036 ฉันยังคงรอการตอบสนองจากแอปเปิ้ล ไม่มีอะไรน่าสนใจเป็นพิเศษหากคุณตรวจสอบกระบวนการใน ActivityMonitor แต่บางทีฉันอาจพลาดอะไรบางอย่าง
kextstat
ฉันกำลังเปรียบเทียบองค์ประกอบในขนาดและแบบใช้สายจาก ความเข้าใจของฉันคือถ้าkextรั่วแล้วไบต์ที่ปันส่วนและเคอร์เนลที่รู้ถูกจัดสรรจะแตกต่างกัน ในกรณีนี้ฉันวางไว้ตรงนั้นเพื่อแสดงว่าฉันไม่มี kext ที่รั่ว - ดังนั้น 2) สิ่งนี้จะไม่เกิดขึ้นเมื่อ Preview กิน ram แทนที่จะkernel_task
เติบโตขึ้นมาก ฉันจะพยายามสร้างปัญหานี้ขึ้นใหม่และถ่ายรูป :-)
diff
คำสั่งของคุณกำลังเปรียบเทียบSize
และWired
คอลัมน์จากkextstat
ผลลัพธ์ ฉันยอมรับว่าSize
เป็น "หน่วยความจำที่จัดสรร" แต่ฉันไม่คิดว่าWired
เป็น "คาดว่าจะได้รับการจัดสรร" (man kextstat
อธิบายว่า "จำนวนไบต์ต่อสายของหน่วยความจำเคอร์เนลที่ kext ใช้") 2) คุณเห็นความแตกต่างระหว่างSize
และWired
เมื่อคุณมีปัญหากับหน้าตัวอย่างหรือไม่