سؤال

لدي مشكلة تسرب الذاكرة في .صافي را التطبيق.

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

ترى الإخراج من RPM عبر PerfMon عن عملية كومة العداد:
alt text

GC كومة الذاكرة المؤقتة:
alt text

تخميني هو أن ضعف الإشارة إلى لوحة لسبب غير معروف لا يجعل الكائن مؤهلة GC, يمكن أن يكون ؟

يرجى ملاحظة ما يلي: على الرغم من Dispose() يحل مشكلة العينة ، وأنا لا يمكن بسهولة دمجها في التطبيق الموجود كما أنها ليست واضحة المعالم لتحديد الأشياء التي لم تعد تستخدم.

لقد تضمنت نسخة مبسطة من مصدر لتوضيح المشكلة:

using System;
using System.Windows.Forms;

namespace CFMemTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // Calling this event handler multiple times causes the memory leak
        private void Button1_Click(object sender, EventArgs e)
        {
            Panel uc = new Panel();
            // Calling uc.Dispose() cleans up the object 
        }
    }
}

تحديث:
1.داعيا GC.جمع() أيضا لا يؤدي إلى لوحات يجري تنظيفها.
2.باستخدام .صافي را 2.0 المزود بحزمة الخدمة SP1 على نظام التشغيل Windows CE 4.2 الجهاز.

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

المحلول

بعض المعلومات الإضافية هنا أن يفسر هذا السلوك.

وفقا ايليا Tumanov:

كل واجهة المستخدم ذات الصلة على NETCF هو عمدا إزالتها من GC نطاق حتى أنه لم يتم جمعها.هذا السلوك هو مختلف من سطح المكتب و تم تغير في NETCF V3.5 (ما لم يعمل في وضع التوافق).

كان مختلفا جدا لأنه تمكن واجهة المستخدم دروس في NETCF تماما مختلفة من سطح المكتب.فهي رقيقة مغلفة على تنفيذ الأصلي الذي كان في حاجة إلى تحقيق مقبول الأداء.

أنا لست متأكد من أن هناك مثل هذه الموارد.ولكن في الحقيقة, كل ما تحتاج إلى معرفته هو:إنه لم يتم جمعها ، يجب أن ندعو التصرف.فعلا يجب أن نفعل ذلك على سطح المكتب وكذلك ولكن إذا كنت لا طريقها أكثر تسامحا.وليس ذلك على NETCF.

نصائح أخرى

شكل لا تلقائيا التخلص جميع عناصر التحكم التي تم إنشاؤها في التعليمات البرمجية الخاصة به ، كما أنه قد لا يوجد طريقة أعرف أنه موجود.للحصول على شكل إلى شكل التصرف تلقائيا عندما يكون التصرف تحتاج إلى إضافة إلى عناصر مجموعة.

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

سأكون في غاية يوصي لك نلقي نظرة على MSDN البث الشبكي على إدارة الذاكرة في CF.أنه يوفر أكثر دقة تفسير ما يحدث تحت غطاء محرك السيارة - أكثر بكثير مما يمكن أن تقدم في إجابة هنا.

هل أنت متأكد من أن لديك تسرب للذاكرةعلى .NET Framework ضغط القمامة جامع يعمل بشكل مختلف قليلا في الكامل .NET framework.من ستيفن Pratschner بلوق:

مجموعة بدأت عندما إما:

  • 1MB من الكائنات التي تم تخصيصها ،

  • تطبيق انتقلت إلى الخلفية ،

  • عدم تخصيص الذاكرة يحدث

  • تطبيق المكالمات GC.جمع.

أعتقد أنك بحاجة إلى حيوي إزالة انقر فوق زر EventHandler أيضا ، كما يمكنك أن ترى من هذه المدونة :http://blogs.msdn.com/stevenpr/archive/2007/03/08/finding-managed-memory-leaks-using-the-net-cf-remote-performance-monitor.aspx

هو من ستيفن Pratschner أيضا.

بالمناسبة, البث الشبكي المذكورة أعلاه يرتبط هنا:http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?culture=en-US&EventID=1032318791&CountryCode=US

ويساعد هذا الأمل!

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