मुझे पहले कहा गया है कि एक संकेत है कि कुछ एप्लिकेशन में मेमोरी लीक है, kernel_task
जिसमें एक बड़ी मेमोरी पदचिह्न है, जो आमतौर पर गीगाबाइट के आदेश पर है। यदि एक भयावहता kext
इस स्मृति उपयोग का कारण बन रही थी, तो हम आवंटित स्मृति और उन लोगों के बीच एक विसंगति देखने की उम्मीद करेंगे जिन्हें आवंटित किया जाना है, अर्थात
diff <(kextstat|tr -s ' ' | cut -d ' ' -f 5) <(kextstat| tr -s ' ' | cut -d ' ' -f 6)
'वायर्ड' और 'नाम' शब्दों के अलावा कुछ और लौटाएगा।
अपनी थीसिस लिखते समय, मैंने देखा है कि पूर्वावलोकन में खुला होने के दौरान पीडीएफ बदलने पर अक्सर खराब चीजें होती हैं: कभी-कभी, मेमोरी का उपयोग kernel_task
लगभग आठ गीगाबाइट या उससे अधिक तक बढ़ सकता है। यदि मैं पूर्वावलोकन मारता हूं, तो यह सामान्य रूप से, तुरंत वापस आ जाता है । तो, स्पष्ट रूप से कुछ गलत है - और पूर्वावलोकन इन शर्तों के तहत मेमोरी लीक कर रहा है।
तो, मेरा सवाल यह है: अगर मुझे पता है कि एक प्रक्रिया के माध्यम से अचानक और अप्रत्याशित वृद्धि के माध्यम से रैम लीक हो गया है kernel_task
, तो ओएस एक्स क्यों नहीं जान सकता कि कुछ गलत हो गया है। अगर प्रीव्यू मारने से मेरी गुमशुदा malloc()
याददाश्त बहाल हो जाती है , तो डार्विन मेरे लिए कचरा संग्रह स्वचालित रूप से क्यों नहीं करता ?
क्या मुझे एक बुनियादी गलतफहमी है कि स्मृति प्रबंधन कैसे काम करता है?
संपादित करें: (15/9/15)
यहाँ मैं किस बारे में बात कर रहा हूँ का एक प्रदर्शन है। सबसे पहले, मैं उच्च स्मृति उपयोग को नोटिस करता हूं kernel_task
(नोट पूर्वावलोकन खुला है, बस गतिविधि मॉनिटर के निचले भाग में दिखाई दे रहा है, 333 MiB का उपयोग करके RAM):
नीचे एशले द्वारा उपयोगी टिप्पणियों के बाद, आइए जानें कि प्रत्येक 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 हैं; उनके ड्राइवर केवल वायर्ड रैम के कुछ MiB का उपयोग कर रहे हैं। मेरे कूबड़ पर, चलो पूर्वावलोकन को मारते हैं, और देखो कि स्मृति पदचिह्न का क्या होता है kernel_task
:
पूर्वावलोकन चला गया, और कर्नेल की स्मृति पदचिह्न नाटकीय रूप से नीचे चली गई है। अभी भी kext उपयोग में बदलाव का कोई सबूत नहीं है: उपरोक्त कमांड का आउटपुट अपरिवर्तित है।
संपादित करें : बग को नंबर 22701036 के रूप में रिपोर्ट किया गया। मैं अभी भी सेब की प्रतिक्रिया का इंतजार कर रहा हूं। विशेष रूप से दिलचस्प नहीं है अगर आप एक्टिविटी मॉनीटर में प्रक्रिया का निरीक्षण करते हैं, लेकिन शायद मैं कुछ याद कर रहा हूं।
kextstat
। मेरी समझ यह है कि यदि कोई क्यूट लीक कर रहा है, तो आवंटित बाइट्स और जो कर्नेल को पता है आवंटित किए गए हैं वे अलग होंगे। इस मामले में, मैंने उसे यह दिखाने के लिए रखा है कि मेरे पास लीक करने वाला क्यूट नहीं है - इसलिए, 2) यह तब नहीं होता है जब पूर्वावलोकन राम खाता है। इसके बजाय, kernel_task
बहुत बढ़ता है। मैं कोशिश करूँगा और इस मुद्दे को फिर से बनाऊंगा और एक तस्वीर लेऊंगा :-)।
diff
कमांड आउटपुट से कॉलमSize
औरWired
कॉलम की तुलना कर रही हैkextstat
। मैं मानता हूं किSize
"आवंटित मेमोरी" है, लेकिन मुझे नहीं लगताWired
कि "आवंटित होने की उम्मीद है" (man kextstat
इसे "कर्नेल मेमोरी के वायर्ड बाइट्स की संख्या के रूप में वर्णित करता है")। 2) क्या आप के बीच की विसंगति देख रहे हैंSize
औरWired
जब आपके पास पूर्वावलोकन के साथ समस्या है?