سؤال

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

أيضا، جميع كائنات جذر GC على قائمة انتظار النهائي هي مثيلات system.windows.forms.control + threadmethodentry. الكائنات المسماة "المتصل". أرى أنه يشارك في تفاعل UI متعدد الصفحات، لكنني لا أعرف الكثير عن ذلك. اغفر كزعي الواضح واعترف بالجهل، لكن هذه الموارد مدفونة داخل عنصر البائع. أنا أتحدث إلى البائع حول هذه القضايا، لكنني بحاجة إلى بعض الاتجاه للحصول على السرعة في المحادثة. هل يمكنك توجيه لي إلى أكثر التعريف فائدة لمخضيراتها أيضا؟ أي نصيحة قصصية؟

أيضا، هل يجب أن أشعر بالقلق إزاء هذه الأشياء على قائمة انتظار النهائي؟

تحديث: هذه البوابة الحمراء المادة كان مفيدا.

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

المحلول

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

بعد أن عملت مع تسرب الذاكرة في الماضي، فإن رؤية مجموعة كائنات البائع الخاصة بك في قائمة انتظار النهوضية يمكن أن تكون رمز قذرة، لكنها لا تشير إلى تسرب الذاكرة. عادة، سوف يكشف الرمز الجيد طريقة التخلص من التخلص من الموارد التي تديرها الموارد المدارة وغير المدارة، وفي القيام بذلك، قم بإزالة أنفسهم من قائمة الانتظار النهائية عبر GC.SuppressFinalize(). وبعد لذلك، إذا كانت كائنات البائع تنفذ طريقة التخلص، ولا يسمي الكود الخاص بك، فقد يؤدي ذلك إلى مجموعة من الكائنات في قائمة انتظار النهائي.

هل حاولت إنشاء لقطة في النمل بين نقطتين في الوقت المناسب ومقارنة الأشياء التي تم إنشاؤها بينهما؟ قد يساعدك ذلك في تحديد أي كائنات مدارة يتم تسريبها.

أيضا، إذا كنت تريد معرفة ما إذا كانت الذاكرة تختفي عندما يتم تشغيل النهائي، جرب هذا فقط لاختبار مع:

system.gc.collect ()؛ system.gc.witeforpensfinalizers ()؛ / / قد يتم حظر هذه الطريقة أثناء تشغيله System.gcollect ()؛

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

لاحظ أيضا أن هناك ذاكرة التخزين المؤقت للملكية منخفضة المستوى في كود Windows.Forms الأساسي الذي سيعقد إلى آخر مربع حوار مشروط مفتوح. قد يكون هذا مصدر تسرب الذاكرة. طريقة واحدة مؤكدة للتخلص من هذه المرجع هي فرض مربع حوار بسيط آخر لتظهر، ثم قم بتشغيل رمز GC أعلاه.

نصائح أخرى

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

فئة ThreadMethodentry هي تطبيقات من IAsyCresult ومثيلات هذه الفئة عادة ما يتم إنشاؤها عادة عند استدعاء العمليات غير المتزامنة، مثل استخدام المستحضرات لتحديث UI أو استخدام الأساليب * / END *.

هنا وظيفة مدونة جيدة التي تصف مشكلة مماثلة. على مستوى تقني أكثر، يمكنك أن تتطلع إلى استخدام SOS.DLL (الذي يصفه منشور المدونة) و sosex.dll. لمساعدتك في العمل في حالة وجود هذه الكائنات ThreadMethodentry معلقة في الذاكرة. هناك أوامر في امتدادات Windbg هذه التي يمكن أن تتبع ما هي الكائنات الأخرى التي تشير إلى كائن معين في الذاكرة.

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