WinDbg

2013-01-16 14 views
6

के साथ डंप करते समय बड़े ऑब्जेक्ट ढेर के 'फ्री' ब्लॉक का क्या अर्थ है I PerfMon & WinDbg के साथ मेमोरी लीक समस्या की जांच कर रहा हूं। मुझे लगा कि 'बड़ी स्मृति ढेर' काउंटर 10 एमबी से 37 एमबी तक बढ़ गया है। एक जीसी बल के बाद यह केवल 28 एमबी तक कम हो सकता है। enter image description hereWinDbg

(कोई फर्क नहीं पड़ता कि कितने समय मैं आपरेशन (/ बनाने को नष्ट) repeate, जीसी के बाद, बड़ी वस्तु ढेर 28MB पर स्थिर है)।

मुझे पता है कि कौन सी वस्तुएं रिसाव समस्या का कारण बनती हैं, इसलिए मैं WinDbg को '! डंपेप -min 85000' कॉमांड के साथ चलाता हूं। दो स्नैपशॉट्स को कैप्चर किया गया, पहला मेमोरी रिसाव से पहले किया गया था; दूसरा एक स्मृति रिसाव के बाद है:

से पहले:

 MT Count TotalSize Class Name 
6f39fb08  1  89024 System.String 
6f3a4aa0  1  107336 System.Byte[] 
6f356d84  2  262176 System.Object[] 
00360e4c  1  350392 System.Collections.Generic.Dictionary`2+Entry[Int64,Int32][] 
6f3a2a94  3  592584 System.Int32[] 
00360c24  1  727072 System.Collections.Generic.Dictionary`2+Entry[String,Int64][] 
0bc78b34  4  2754488 System.Collections.Generic.Dictionary`2+Entry[Int64, AccountNode][] 
00730260  10  5375572  Free 

के बाद:

 MT Count TotalSize Class Name 
6f39fb08  1  89024 System.String 
6f3a4aa0  1  107336 System.Byte[] 
6f3a55d8  2  202080 System.Collections.Hashtable+bucket[] 
6f356d84  2  262176 System.Object[] 
00360e4c  1  350392 System.Collections.Generic.Dictionary`2+Entry[Int64,Int32][] 
00360c24  1  727072 System.Collections.Generic.Dictionary`2+Entry[String,Int64][] 
6f3a2a94  4  738008 System.Int32[] 
6cf02838  1  872488 System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.ComponentModel.PropertyKey, WindowsBase],[MS.Internal.ComponentModel.DependencyPropertyKind, WindowsBase]][] 
0bc78b34  4  2754488 System.Collections.Generic.Dictionary`2+Entry[Int64, AccountNode][] 
00730260  14  21881328  Free 
Total 31 objects 

इन दो स्नैपशॉट Camparing, सबसे अंतर 'फ्री' का आकार है। इसका आकार 16 एमबी के करीब बढ़ गया है। क्या कोई मुझे बता सकता है कि 'फ्री' का अर्थ क्या है, क्या यह खाली स्थान है? क्या फ्रिजमेंट के कारण वृद्धि हुई है?

this article के अनुसार, 'बड़े ऑब्जेक्ट हीप साइज' प्रदर्शन काउंटर में नि: शुल्क स्थान शामिल है। तो मेरे मामले में, बड़ी वस्तु ढेर पर बहुत अधिक स्मृति रिसाव नहीं है, केवल 2 एमबी (= 28 - 10 -16), है ना?

+2

यह एक रिसाव नहीं है। यह सामान्य बात है। * जी * कॉल करें जीसी। कोलेक्ट(), यह बहुत हानिकारक है। जब तक आपका प्रोग्राम अत्यधिक मात्रा या स्मृति या ओओएम के साथ दुर्घटनाओं का उपयोग शुरू नहीं करता तब तक "लीक" का पीछा न करें। 37 एमबी मूंगफली है। सीएलआर के माध्यम से रिचटर सी # जैसी अच्छी किताब के साथ स्वयं को शिक्षित करें। –

+0

आपके उत्तर के लिए धन्यवाद। मैं आपसे सहमत हूं कि हमें उत्पाद कोड में जीसी.कोलेक्ट() को कॉल नहीं करना चाहिए। मुझे समझ में नहीं आता क्यों "लीक" मुद्दा का पीछा नहीं करते? जैसा कि मुझे पता है, उतना ही 'कचरा' ढेर में रहता है, जितना जीसी हुआ था। मेरी राय में, हमें इसका पीछा करना चाहिए और अनावश्यक प्रतिरक्षा (यानी अनियंत्रित घटना) काटना चाहिए, जिससे स्मृति रिसाव की समस्या हो सकती है। – Anders06

उत्तर

0

बड़े ऑब्जेक्ट ढेर का अर्थ well explained here है।

बड़ी वस्तुएं उस क्षेत्र में संग्रहीत 85kb से अधिक आकार की वस्तुएं हैं, और केवल तब एकत्र की जाती हैं जब पीढ़ी 2 को पुनः दावा किया जाएगा।

+0

@ डेविल, आपके उत्तर के लिए धन्यवाद। हालांकि मैं 'बड़े ऑब्जेक्ट ढेर' के बारे में सवाल नहीं पूछ रहा हूं लेकिन WinDbg में दिखाया गया 'फ्री' आइटम। – Anders06

+0

एक आवेदन के निष्पादन के दौरान जीसी वस्तुओं को आवंटित और हटा देता है, इसलिए ढेर बढ़ता है, लेकिन यह प्रदर्शन कारणों से प्रत्येक डीलोकेशन में कम नहीं होगा। ऐसा करने से एप्लिकेशन को अतिरिक्त मेमोरी आवंटित किए बिना नई वस्तुओं के लिए पर्याप्त जगह मिल सकती है। जीसी आंतरिक तंत्र, कभी-कभी, अप्रयुक्त ढेर के हिस्से को कम करने के हिस्से को पुनः प्राप्त करते हैं। मुझे लगता है कि ऑब्जेक्ट आकार योग और वर्तमान में आवंटित ढेर के बीच अंतर अंतर है। –

+0

उत्तर में लिंक मृत है – Kamarey

5

मुफ़्त ढेर पर अप्रयुक्त स्मृति के एक ब्लॉक को इंगित करता है। LOH पर मुफ़्त ब्लॉक की उम्मीद है, क्योंकि LOH कभी संकलित नहीं होता है। इसके बजाय, LOH के लिए मुफ़्त स्थान की एक सूची रखी जाती है। कुछ अपवादों के साथ, सामान्य जीसी ढेर पर मुफ़्त ब्लॉक, वस्तुओं के पिनिंग के कारण विखंडन को इंगित करता है। जब जीसी एक पिन किए गए ऑब्जेक्ट से मुकाबला करता है, तो सेगमेंट की कॉम्पैक्शन रुक जाती है और अप्रयुक्त वस्तुओं द्वारा उपभोग की गई मेमोरी को मुफ्त में चिह्नित किया जाता है। जो आप LOH पर देख रहे हैं वह सामान्य है। याद रखें कि LOH कभी संकलित नहीं होता है और LOH के लिए आवंटित स्मृति खंड कभी मुक्त नहीं होते हैं, इसलिए LOH कभी भी कम नहीं होता है।

+0

यह। बड़े ऑब्जेक्ट ढेर के बारे में सबसे समस्याग्रस्त हिस्सा यह है कि यह कॉम्पैक्शन की कमी है, जो (यदि आप अनजाने में इसका दुरुपयोग कर रहे हैं) तो ढेर विखंडन का कारण बनता है, मूल रूप से वही चीज जो आपके हार्ड ड्राइव से होती है। – JerKimball

+0

धन्यवाद, मैं अब मुफ्त संकेतक के बारे में बहुत स्पष्ट हूं। – Anders06

संबंधित मुद्दे