क्यों लीक की गई मेमोरी को कर्नेल_टैस्क में मॉलोक किया गया है, और ओएस एक्स इसलिए कचरा इकट्ठा नहीं कर सकता है


11

मुझे पहले कहा गया है कि एक संकेत है कि कुछ एप्लिकेशन में मेमोरी लीक है, 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 के रूप में रिपोर्ट किया गया। मैं अभी भी सेब की प्रतिक्रिया का इंतजार कर रहा हूं। विशेष रूप से दिलचस्प नहीं है अगर आप एक्टिविटी मॉनीटर में प्रक्रिया का निरीक्षण करते हैं, लेकिन शायद मैं कुछ याद कर रहा हूं।


मैं दो चीजों के बारे में उलझन में हूँ - क्या आप स्पष्ट कर सकते हैं? 1) मुझे लगता है कि आपकी diffकमांड आउटपुट से कॉलम Sizeऔर Wiredकॉलम की तुलना कर रही है kextstat। मैं मानता हूं कि Size"आवंटित मेमोरी" है, लेकिन मुझे नहीं लगता Wiredकि "आवंटित होने की उम्मीद है" ( man kextstatइसे "कर्नेल मेमोरी के वायर्ड बाइट्स की संख्या के रूप में वर्णित करता है")। 2) क्या आप के बीच की विसंगति देख रहे हैं Sizeऔर Wiredजब आपके पास पूर्वावलोकन के साथ समस्या है?
एशले

1) तुम सही हो - मैं आकार और तार से तत्वों की तुलना कर रहा हूं kextstat। मेरी समझ यह है कि यदि कोई क्यूट लीक कर रहा है, तो आवंटित बाइट्स और जो कर्नेल को पता है आवंटित किए गए हैं वे अलग होंगे। इस मामले में, मैंने उसे यह दिखाने के लिए रखा है कि मेरे पास लीक करने वाला क्यूट नहीं है - इसलिए, 2) यह तब नहीं होता है जब पूर्वावलोकन राम खाता है। इसके बजाय, kernel_taskबहुत बढ़ता है। मैं कोशिश करूँगा और इस मुद्दे को फिर से बनाऊंगा और एक तस्वीर लेऊंगा :-)।
लैंडक

धन्यवाद! एक सेकंड में पकड़ो: मैं सिर्फ एक उत्तर लिख रहा हूं जो मदद कर सकता है।
एशले

जवाबों:


6

ओएस एक्स के मुख्य कचरा एकत्र नहीं है, IOKit के libkern C ++ रनटाइम को डेवलपर्स को अपनी स्मृति का प्रबंधन करने की आवश्यकता होती है।

मैक मेमोरी मैनेजमेंट

से कैसे मैक ओएस एक्स में स्मृति प्रबंधन काम करता है?

ऐप्पल मैक कर्नेल के सबसे निचले स्तरों और वर्चुअल मेमोरी सबसिस्टम के वेब दस्तावेज़ों के डेवलपर के हिस्से के रूप में काफी निचले स्तर पर है।

चूंकि कर्नेल को कार्नेगी मेलन विश्वविद्यालय द्वारा विकसित किया गया था , इसलिए आप इसे आसानी से वर्णन करने वाले दर्जनों कागजात पा सकते हैं ।

अन्य स्रोत

कचरा इकठा करना

कचरा संग्रह उपयोगकर्ता या अनुप्रयोग परत पर मौजूद है। इस स्तर पर भी, कचरा संग्रह केवल तभी मदद करता है जब आवेदन ने मेमोरी के सभी दावों को जारी किया हो। एक परिपत्र निर्भरता कचरा संग्रह को हरा सकती है। कचरा संग्रह अपने आप में अनुसंधान का एक विकसित क्षेत्र है और सही पाने के लिए मुश्किल है

बग्स और मेमोरी लीक्स की रिपोर्ट करें

ओएस एक्स के भीतर कीड़े मेमोरी लीक हो जाएंगे। कोड आधार के आकार को देखते हुए, यह लगभग निश्चित है।

कृपया सीधे Apple को प्रतिलिपि प्रस्तुत करने योग्य बग रिपोर्ट करें । हर बग रिपोर्ट मदद करती है और शायद आपका उदाहरण वह होगा जो ऐप्पल के इंजीनियरों को कारण बताने में मदद करता है।


यह निराशाजनक है, लेकिन निस्संदेह सही है। मैंने बग की सूचना Apple को दी है - मुझे सिर्फ यह कष्टप्रद लगता है!
लंडक

2
कृपया आप बग नंबर को अपने प्रश्न के संपादन के रूप में साझा कर सकते हैं। आपके प्रश्न को उपयोगी बनाने वाले अन्य लोग आपके मूल को देखते हुए डुप्लिकेट बग दर्ज कर सकते हैं। संबंधित बगों का ढेर अधिक इंजीनियरिंग समय को सही ठहराने में मदद करेगा।
ग्राहम मिलन

4

यहाँ मेरा अनुमान है, मान लें कि आपके Mac में एक एकीकृत GPU (जैसे Intel Iris ग्राफिक्स) है।

जब आप पूर्वावलोकन में अपने शोध को खोलते हैं, तो पूर्वावलोकन कार्ड की छवि ("बनावट") को पकड़ने के लिए ग्राफिक्स कार्ड मेमोरी का उपयोग किया जाता है, और शायद थीसिस से कुछ ऑफ-स्क्रीन-लेकिन-डिकोड किए गए पृष्ठ भी।

एक एकीकृत ग्राफिक्स कार्ड के साथ, वीडियो मेमोरी वास्तव में (आंशिक रूप से?) सिस्टम रैम में स्थित है, जो सीपीयू और जीपीयू के बीच साझा की जाती है। कुछ एकीकृत ग्राफिक्स कार्ड पर, उपयोग की जाने वाली सिस्टम रैम की मात्रा गतिशील रूप से आवंटित की जाती है ( Apple HT204349 देखें )।

मुझे लगता है कि आप ग्राफिक्स कार्ड ड्राइवर और / या पूर्वावलोकन में एक बग देख रहे हैं, जो कि सिस्टम मेमोरी को सही ढंग से रिलीज़ नहीं कर रहा है जब पूर्वावलोकन आपकी थीसिस पीडीएफ को पुनः लोड करता है। (हालाँकि, यह बग OS X / द्वारा कम किया गया है / पूर्वावलोकन पूर्वावलोकन होने पर ड्राइवर मेमोरी को सही ढंग से रिलीज़ कर रहा है।)

आप के आउटपुट को kextstatदेखने की कोशिश कर सकते हैं और यह देख Sizeसकते हैं कि समस्या का अनुभव होने पर कॉलम में संख्या बढ़ जाती है या नहीं। मेरा सिद्धांत है कि आपके द्वारा उल्लेखित 8GB की वृद्धि ग्राफिक्स कार्ड ड्राइवर के कारण होगी।

निम्न आदेश (पर एक टिप्पणी से यह संबंधित और दिलचस्प जवाब ) के उत्पादन में सॉर्ट करता kextstatयह आसान जो kext द्वारा सबसे स्मृति हालांकि टिप्पणी इस प्रकार उपयोग कर रहा है (देखने के लिए बनाने के लिए Wiredस्तंभ ... वहाँ में एक समान, सरल मंत्र है इस एक स्पष्टीकरण के साथ उत्तर दें यदि आप इसे ट्विक करना चाहते हैं)।

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

अच्छा अनुमान - और एक उपयोगी, हल किए गए आउटपुट के लिए आपका बहुत-बहुत धन्यवाद kextstat। हालाँकि, यह अभी भी ऐसा नहीं लगता है कि वास्तव में क्या चल रहा है: पूर्वावलोकन-गॉब्लिंग के दौरान, स्मृति पदचिह्न com.apple.nvidia.driver.*अपरिवर्तित था। मैंने इसे दर्शाने के लिए अपना प्रश्न संपादित किया है।
लैंडक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.