के साथ डंप करते समय बड़े ऑब्जेक्ट ढेर के 'फ्री' ब्लॉक का क्या अर्थ है I PerfMon & WinDbg के साथ मेमोरी लीक समस्या की जांच कर रहा हूं। मुझे लगा कि 'बड़ी स्मृति ढेर' काउंटर 10 एमबी से 37 एमबी तक बढ़ गया है। एक जीसी बल के बाद यह केवल 28 एमबी तक कम हो सकता है। WinDbg
(कोई फर्क नहीं पड़ता कि कितने समय मैं आपरेशन (/ बनाने को नष्ट) 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), है ना?
यह एक रिसाव नहीं है। यह सामान्य बात है। * जी * कॉल करें जीसी। कोलेक्ट(), यह बहुत हानिकारक है। जब तक आपका प्रोग्राम अत्यधिक मात्रा या स्मृति या ओओएम के साथ दुर्घटनाओं का उपयोग शुरू नहीं करता तब तक "लीक" का पीछा न करें। 37 एमबी मूंगफली है। सीएलआर के माध्यम से रिचटर सी # जैसी अच्छी किताब के साथ स्वयं को शिक्षित करें। –
आपके उत्तर के लिए धन्यवाद। मैं आपसे सहमत हूं कि हमें उत्पाद कोड में जीसी.कोलेक्ट() को कॉल नहीं करना चाहिए। मुझे समझ में नहीं आता क्यों "लीक" मुद्दा का पीछा नहीं करते? जैसा कि मुझे पता है, उतना ही 'कचरा' ढेर में रहता है, जितना जीसी हुआ था। मेरी राय में, हमें इसका पीछा करना चाहिए और अनावश्यक प्रतिरक्षा (यानी अनियंत्रित घटना) काटना चाहिए, जिससे स्मृति रिसाव की समस्या हो सकती है। – Anders06