2009-10-08 18 views
7

क्या जीसी शुरू होने पर कोई ईवेंट प्राप्त करना संभव नहीं है? मैं प्रत्येक व्यक्तिगत जीसी का समय बिताना चाहता हूं ताकि मैं देख सकूं कि मेरे सर्वर में रुकने के कारण जीसी या कुछ और है।जीसी घटनाओं को शुरू और बंद करें

जीसी चलते समय सभी .NET धागे को रोकता है, है ना? (निश्चित रूप से यह धागा छोड़कर)। अप्रबंधित धागे के बारे में कैसे?

धन्यवाद!

+0

आपकी टिप्पणियों के लिए धन्यवाद, यह तेज़ था :-) मैं थोड़ी देर के लिए उत्तर की तलाश कर रहा हूं, इसलिए मुझे पहले से ही इन सुझावों (पहली 3 टिप्पणियों) के बारे में पता है। मैं एक टाइमलाइन पर दिखाना चाहता हूं जब जीसी चल रहा है और जब यह नहीं है। तो यह जानकर कि यह कब किया जाता है, या आखिरी संग्रह के बाद से यह कितना समय उपयोग कर रहा है, ऐसा नहीं करेगा। मुझे आश्चर्य है कि मैं अभी तक समाधान नहीं ढूंढ पा रहा हूं, लेकिन यदि कुछ भी मौजूद नहीं है तो मैं इसे करने के लिए अपना खुद का hax0r टूल लिखने की कोशिश करूंगा। फिर से धन्यवाद! – Rabbit

उत्तर

3

यह है कि प्रोफाइलिंग API क्या है। ICorProfilerCallback2::GarbageCollectionStarted और GarbageCollectionFinished देखें।

चूंकि यह एक प्रोफाइलर है, यह स्पष्ट रूप से उत्पादन प्रणाली पर नियमित उपयोग के लिए उपयुक्त नहीं है। लेकिन ऐसा लगता है कि आप मुख्य रूप से नैदानिक ​​उद्देश्यों के लिए इसमें रुचि रखते हैं। तो यह जांचने लायक हो सकता है कि वाणिज्यिक प्रोफेसरों में से कोई एक सुविधा पहले से ही प्रदान करता है, या क्या परफमन काउंटर पर्याप्त होंगे - अपना खुद का प्रोफाइलर लिखना एक बेहद हेवीवेट समाधान हो सकता है!

+0

यही वह है जिसे मैं ढूंढ रहा था! यह ज्यादातर शौक परियोजना है इसलिए "बहुत भारी हेवीवेट" समाधान ठीक लगता है (जब तक मैं ऊब जाता हूं और एक नई पालतू परियोजना नहीं ढूंढता :) धन्यवाद! – Rabbit

0

अप्रबंधित धागे जीसी से प्रभावित नहीं हैं।

आप प्रदर्शन मॉनिटर में जीसी प्रदर्शन देख सकते हैं, यहां एक सिस्टम मॉनिटर बनाने के तरीके पर एक लेख है। मुझे लगता है कि आप किसी भी तरह जीसी के लिए काउंटर प्राप्त कर सकते हैं।

Codeproject

यहाँ जीसी द्वारा प्रयोग किया जाता

GC counters

1

जीसी किसी भी घटनाओं जारी नहीं करता है पर्फ़ काउंटर का वर्णन है, लेकिन आप एक टाइमर का उपयोग और GC.CollectionCount() फोन को देखने के लिए कर सकते हैं जब एक संग्रह हुआ है।

0

% Time in GC प्रदर्शन काउंटर आपको वह डेटा प्रदान करना चाहिए जो आप चाहते हैं।

5

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

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

चाल अब आपके द्वारा लॉग इन करने वाले अंतिम रूप में है (जिसे आप उपयोग करना चाहते हैं) में है कि अंतिम रूप से चल रहा है, और जब तक कि एपडोमेन बंद करने की प्रक्रिया में न हो, तब तक आप बस एक नई वस्तु का निर्माण करें जिसे आप तुरंत छोड़ दें संदर्भ, अगले जीसी के लिए तैयार है।

यह आश्चर्यजनक रूप से अच्छी तरह से काम करता है और आपके हिस्से से अधिक काम की आवश्यकता नहीं है।

namespace PresentationMode 
{ 
    /// <summary> 
    /// This class is used to get a running log of the number of garbage collections that occur, 
    /// when running with logging. 
    /// </summary> 
    public sealed class GCLog 
    { 
     #region Construction & Destruction 

     /// <summary> 
     /// Releases unmanaged resources and performs other cleanup operations before the 
     /// <see cref="GCLog"/> is reclaimed by garbage collection. 
     /// </summary> 
     ~GCLog() 
     { 
      SiAuto.Main.LogMessage("GARBAGE COLLECTED"); 
      if (!AppDomain.CurrentDomain.IsFinalizingForUnload() && !Environment.HasShutdownStarted) 
       new GCLog(); 
     } 

     #endregion 

     #region Public Static Methods 

     /// <summary> 
     /// Registers this instance. 
     /// </summary> 
     public static void Register() 
     { 
#if DEBUG 
      if (SiAuto.Si.Enabled) 
       new GCLog(); 
#endif 
     } 

     #endregion 
    } 
} 

आपको बस इतना करना है फोन .Register() विधि है:

यहाँ वर्ग मैं उपयोग करते हैं। यहां ध्यान दें कि मैं अपने लॉगिंग टूल के रूप में SmartInspect का उपयोग करता हूं ताकि आप किसी अन्य चीज़ के साथ SiAuto से जुड़े कॉल को प्रतिस्थापित करना चाहें।

एक अन्य प्रोजेक्ट में, SmartInspect का उपयोग करके, जिसमें 'घड़ियों' की धारणा है, जहां आप संख्यात्मक मान भेज सकते हैं, और लॉगिंग टूल में उन्हें ग्राफ़ कर सकते हैं, मैंने मूल्य 0, 1, और फिर 0 को तेजी से उत्तराधिकार में भेजा , क्योंकि यह मुझे एक ग्राफ देगा जो हर समय 0 पर आयोजित होता है, लेकिन जीसी चलने पर एक तेज स्पाइक उत्पन्न करता है। इसे बैकग्राउंड थ्रेड के साथ युगल करें जिसने मॉनिटर किए गए सीपीयू उपयोग और मेमोरी के साथ काम करने के लिए मुझे बहुत अच्छा डेटा दिया।

0

आप सीएलआर होस्टिंग का उपयोग कर जीसी निलंबन की सटीकता से निगरानी और माप सकते हैं। आप इस पोस्ट में बिल्कुल उदाहरण के लिए एक उदाहरण पा सकते हैं: Accurately Measuring GC Suspensions

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