سؤال

ما هي السبل التي يمكننا الحصول على تسرب الذاكرة في .الشبكة ؟

أنا أعرف اثنين:

  1. لا يصح إلغاء التسجيل معالجات الأحداث/مندوبين.
  2. لا التصرف الديناميكي الطفل يتحكم في نظام التشغيل Windows أشكال:

على سبيل المثال:

// Causes Leaks  
Label label = new Label();  
this.Controls.Add(label);  
this.Controls.Remove(label);  

// Correct Code  
Label label = new Label();  
this.Controls.Add(label);  
this.Controls.Remove(label);  
label.Dispose();

التحديث:الفكرة هي أن قائمة المخاطر الشائعة التي ليست واضحة جدا (مثل ما سبق).عادة فكرة أن تسرب الذاكرة ليست مشكلة كبيرة لأن من جامع البيانات المهملة.ليس كما كان في C++.


مناقشة كبيرة الرجال ، ولكن اسمحوا لي أن أوضح...بحكم التعريف ، إذا كان هناك أي إشارة من اليسار إلى كائن في .صافي ، سيكون من القمامة التي تم جمعها في بعض الوقت.بحيث لا وسيلة للحث تسرب الذاكرة.

في بيئة مدارة ، وأود أن تنظر فيه تسرب الذاكرة إذا كان غير مقصود الإشارة إلى أي كائن التي لم تكن على علم (ومن هنا مثالين في سؤالي).

ما هي مختلف السبل التي من هذا القبيل تسرب الذاكرة يمكن أن يحدث ؟

هل كانت مفيدة؟

المحلول

كتلة finalizer الموضوع.أي كائنات أخرى سيتم القمامة التي تم جمعها حتى finalizer الموضوع هو رفع الحجب.وبالتالي فإن كمية الذاكرة المستخدمة سوف تنمو وتنمو.

مزيد من القراءة: http://dotnetdebug.net/2005/06/22/blocked-finalizer-thread/

نصائح أخرى

حقا لا يسبب تسرب هذا يجعل العمل أكثر من أجل GC:

// slows GC
Label label = new Label();  
this.Controls.Add(label);  
this.Controls.Remove(label);  

// better  
Label label = new Label();  
this.Controls.Add(label);  
this.Controls.Remove(label);  
label.Dispose();

// best
using( Label label = new Label() )
{ 
    this.Controls.Add(label);  
    this.Controls.Remove(label);  
}

وترك المتاح مكونات الكذب حول مثل هذا أبدا مشكلة كبيرة في بيئة مدارة مثل .صافي - هذا جزء كبير من ما تمكنت من الوسائل.

سوف تبطئ لك التطبيق إلى أسفل ، بالتأكيد.ولكن لن أترك فوضى من أجل أي شيء آخر.

وضع GridControl.DataSource مكان الإقامة مباشرة دون استخدام مثيل BindingSource الدرجة (http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.aspx).

تسبب هذه التسريبات في التطبيق الذي استغرق مني الكثير من الوقت لتعقب مع التعريف ، في نهاية المطاف وجدت هذا الخلل التقرير أن مايكروسوفت ردت على: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=92260

ومن المضحك أن في وثائق BindingSource الدرجة مايكروسوفت في محاولة لتمرير كما legitmate مدروسة الدرجة, ولكن أعتقد أنها خلقت فقط إلى حل أساسي تسرب بشأن العملة مديري ملزمة البيانات إلى الشبكة الضوابط.

احترس من هذا ، أعتقد أن هناك بالتأكيد الكثير من راشح التطبيقات هناك بسبب هذا!

لا يوجد طريقة تقديم قائمة شاملة...هذا هو يشبه كثيرا يسأل "كيف يمكن أن تحصل على الرطب؟"

أن قال, تأكد من أنك تتصل Dispose() على كل شيء أن تنفذ IDisposable ، والتأكد من تنفيذ IDisposable على أي الأنواع التي تستهلك الموارد غير المدارة من أي نوع.

كل الآن وبعد ذلك ، تعمل شيء مثل التقدم على تعليمات البرمجة الأساسية لمساعدتك على فرض أن القاعدة - سوف يفاجأ مدى عمق بعض الأشياء يمكن التخلص منها الحصول على دفن في إطار التطبيق.

الاستثناءات في وضع اللمسات الأخيرة (أو التخلص دعوات من Finaliser) الأساليب التي تمنع غير المدارة الموارد من يتم التخلص منها بشكل صحيح.واحد مشترك هو بسبب مبرمج على افتراض ما هو ترتيب الأشياء سيتم التخلص ومحاولة الإفراج عن الأقران الكائنات التي تم التخلص منها مما أدى إلى استثناء وبقية وضع اللمسات الأخيرة/التخلص من وضع اللمسات الأخيرة الأسلوب لم يتم استدعائي.

لدي 4 بنود إضافية لإضافة إلى هذه المناقشة:

  1. إنهاء المواضيع (الموضوع.إحباط()) التي خلقت الضوابط واجهة المستخدم بشكل صحيح من دون التحضير مثل هذا الحدث قد يؤدي إلى الذاكرة المستخدمة بترقب.

  2. الوصول إلى الموارد غير المدارة من خلال Pinvoke و عدم تنظيفها قد يؤدي إلى تسرب الذاكرة.

  3. تعديل سلسلة كبيرة من الكائنات.ليس بالضرورة تسرب الذاكرة مرة واحدة خارج نطاق GC سوف تأخذ الرعاية من ذلك, إلا أن الأداء الحكمة ، النظام الخاص بك قد يستغرق ضرب إذا سلاسل كبيرة يتم تعديل كثير من الأحيان لأنه لا يمكن حقا تعتمد على GC لضمان البرنامج الخاص بك طباعة القدم هو الحد الأدنى.

  4. خلق كائنات GDI في كثير من الأحيان إلى إجراء مخصص.إذا كان أداء GDI العمل في كثير من الأحيان ، إعادة استخدام واحد كائن gdi.

داعيا IDisposable في كل مرة هو أسهل مكان للبدء ، بالتأكيد وسيلة فعالة إلى الاستيلاء على جميع منخفضة شنقا تسرب الذاكرة الفاكهة في تعليمات البرمجة الأساسية.ومع ذلك, أنها ليست دائما بما فيه الكفاية.على سبيل المثال ، من المهم أيضا أن نفهم كيف ومتى التعليمات البرمجية المدارة التي تم إنشاؤها في وقت التشغيل ، و أنه بمجرد الجمعيات يتم تحميلها في مجال التطبيق ، فهي لم تفرغ التي يمكن أن تزيد من تطبيق البصمة.

لمنع .صافي تسرب الذاكرة:

1) توظيف 'باستخدام' بناء (أو 'المحاولة أخيرا بناء) كلما كائن مع 'IDisposable' واجهة يتم إنشاؤه.

2) جعل الطبقات 'IDisposable' إذا كانت إنشاء موضوع أو إضافة كائن ثابت أو عاش فترة طويلة جمع.تذكر C# 'الحدث' هو مجموعة.

هنا هو المقال القصير على نصائح لمنع تسرب الذاكرة.

الذي تتحدث عنه غير متوقعة من استخدام الذاكرة الفعلية أو تسرب ؟ اثنين من الحالات المذكورة ليست بالضبط التسريبات ؛ فهي الحالات التي يكون فيها الكائنات حول عصا أطول من الهدف.

وبعبارة أخرى, أنها إشارات الشخص الذي يدعو لهم تسرب الذاكرة لم يعرف أو نسي.

تحرير:أو هم الفعلية الخلل في جمع القمامة أو غير التعليمات البرمجية المدارة.

تحرير 2:وهناك طريقة أخرى للتفكير في ذلك هو دائما التأكد من المراجع الخارجية إلى الأشياء الخاصة بك الحصول على صدر بشكل مناسب.الخارجية يعني رمز خارج عنصر التحكم الخاص بك.بأي حال من الأحوال حيث أن يحدث هو حالة حيث يمكنك "تسرب الذاكرة".

  1. حفظ جميع أنحاء مراجع إلى الكائنات التي لم تعد تحتاج إليها.

إعادة تعليقات أخرى - طريقة واحدة لضمان التخلص يحصل دعا إلى استخدام باستخدام...عندما رمز هيكل يسمح بذلك.

الشيء الوحيد الذي كان غير متوقع بالنسبة لي هو هذا:

Region oldClip = graphics.Clip;
using (Region newClip = new Region(...))
{
    graphics.Clip = newClip;
    // draw something
    graphics.Clip = oldClip;
}

أين تسرب للذاكرةصحيح, يجب أن يكون التخلص منها oldClip, أيضا!لأن Graphics.Clip هي واحدة من النادرة الخصائص التي ترجع المتاح الجديد الكائن في كل مرة جالبة هو الاحتجاج.

تيس فرنانديز كبيرة بلوق وظيفة حول إيجاد وتصحيح تسرب الذاكرة.مختبر 6 مختبر 7

الكثير من الأشياء التي يمكن أن تتسبب في تسرب الذاكرة في غير المدارة اللغات لا يزال يسبب تسرب الذاكرة في إدارتها اللغات.على سبيل المثال ، سوء التخزين المؤقت السياسات يمكن أن يؤدي إلى تسرب الذاكرة.

ولكن كما جريج و "داني" قال: لا يوجد قائمة شاملة.أي شيء يمكن أن يؤدي إلى عقد الذاكرة بعد فترة العمر يمكن أن يسبب تسرب.

طريق مسدود المواضيع لن الافراج عن الجذور.من الواضح أنه يمكن القول بأن الجمود يعرض مشكلة أكبر.

في حالة جمود finalizer الموضوع سوف يمنع جميع من تبقى من finalizers لتشغيل وبالتالي منع جميع finalizable الكائنات من المستصلحة (لأنها لا تزال قيد الجذور قبل freachable قائمة).

على موضوع وحدة المعالجة المركزية آلة يمكن إنشاء finalizable الكائنات أسرع من finalizer الموضوع يمكن تشغيل finalizers.طالما أن هذا هو مستمر سوف "تسرب الذاكرة".وربما هو ليس من المرجح جدا أن يحدث هذا في البرية, ولكن من السهل أن تتكاثر.

الكائن كبيرة كومة لا ضغط ، لذلك يمكن أن تسرب الذاكرة من خلال تجزئة.

هناك عدد من الأشياء التي يجب أن يتحرر يدويا.E. g.الاتصال عن بعد الأشياء بلا عقد الإيجار و الجمعيات (يجب إلغاء تحميل مجال التطبيق).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top