تسريب ذاكرة. يبقى ManagementBaseObject كجذر GC ، ولكنه لم يتم تنظيفه أبدًا

StackOverflow https://stackoverflow.com/questions/3866371

سؤال

أنا أستخدم ANTS Memory Profiler لمحاولة تحديد سبب استمرار نمو ذاكرة التطبيق الخاص بي.

أقوم بتشغيل التطبيق وأخذ لقطات مختلفة مع مرور الوقت. أستطيع أن أرى أن الحالات الحية لـ iwbemClassObjectFreetherderved و Management -baseBaseBject تستمر في الزيادة بمرور الوقت. عند النظر إلى المستكشف المرجعي للفصل ، يمكنني أن أرى أن iwbemClassObjectFreeTherved تتم الإشارة إليها من قبل ManagementBaseObject ، وأن 100 ٪ من أجهزة الإدارة هي جذور GC ، لكن يبدو أنها لم يتم تنظيفها أبدًا. متى يمكنني أن أفعل؟

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

المحلول

هذه مشكلة غير عادية لكنها يمكن أن تحدث. يعتمد WMI على com ، و IwbemClassObject هو واجهة com التي تحصل على مجموعة RCW. لا يتم تنظيف هذه الأغلفة حتى يتم تشغيل خيط Finalizer. من الممكن من الناحية الفنية تشغيل الكثير من استعلامات WMI ولكن لا تقوم بعمل كافٍ مع النتائج للحصول على جامع القمامة.

تشخيص هذا مع perfmon.exe ، شاشة الأداء. انقر بزر الماوس الأيمن على الرسم البياني ، وأضف العدادات ، وذاكرة .NET CLR وأضف عداد مجموعات # Gen 0. حدد البرنامج الخاص بك من القائمة السفلية. راقب العداد أثناء تشغيل البرنامج. سيكون لديك هذه المشكلة إذا لم تكن تتوقيع.

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

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