سؤال

المدمر ينبغي الإفراج عن الموارد غير المدارة هذا الكائن يحمل على ذلك ينبغي الإشارة الكائنات الأخرى.إذا كان لديك فقط تمكن المراجع لا تحتاج إلى (لا ينبغي) في تنفيذ المدمر.كنت تريد هذا فقط من أجل التعامل مع الموارد غير المدارة. لأن هناك بعض التكلفة إلى وجود المدمر, يجب أن تنفذ هذا فقط على الأساليب التي تستهلك قيمة الموارد غير المدارة.

-- العشرة الفخاخ في C# C++ المبرمجين

هذه المادة لا يذهب إلى هذا في أكثر عمقا ، ولكن ما أنواع التكاليف تشارك مع استخدام المدمر في C# ؟

ملاحظة: أنا أعرف عن GC الواقع المدمر لا يسمى في موثوقية مرات ، أن جميع جانبا, هل هناك أي شيء آخر ؟

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

المحلول

أي كائن له finalizer (أنا أفضل هذا المصطلح أكثر المدمر ، التأكيد على الفرق من C++ المتلفات) يضاف إلى finalizer الانتظار.هذه هي قائمة مراجع إلى الكائنات التي لديها finalizer التي يجب أن يسمى قبل أن يتم إزالتها.

عند الكائن عن جمع القمامة ، GC سوف تجد أنه في finalizer طابور ونقل الإشارة إلى freachable (f-الوصول) الانتظار.هذه لائحة من أن finalizer ترابط خلفية يذهب من خلال الاتصال finalizer طريقة كل كائن في المقابل.

مرة واحدة finalizer من وجوه وقد دعا الكائن لم يعد في finalizer الانتظار حتى انها مجرد العادية تمكن الكائن الذي GC يمكن إزالة.

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

نصائح أخرى

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

بعد أن وضعت معا نهج عملي أن تفعل هذا كل يوم - أقل تكلفة ولكن أكثر عن التنفيذ.

Guffa و JaredPar تغطية التفاصيل جيدا حتى أنا أضيف إلى حد ما الباطنية ملاحظة على finalizers أو destructors مثل لغة C# مواصفات للأسف يدعو لهم.

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

تتناول هذه المقالة المشكلة بالتفصيل.من الصعب حقا أن نلخص بشكل بسيط حتى ما بعد: http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

Guffa وقد لخص العوامل في finalizer التكلفة بشكل جيد جدا.كان هناك مؤخرا المادة عن تكلفة finalizers في جافا الذي يعطي أيضا بعض البصيرة.

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


وفيما يلي الرسم البياني للنتائج لا يكون حقا أفضل التسميات ;-)."Debug=true/false" يشير إلى فارغة مقابل بسيطة finalizer:

~ConditionalFinalizer()  
{  
    if (DEBUG)  
    {  
        if (!resourceClosed)  
        {  
            Console.Error.WriteLine("Object not disposed");  
        }  
        resourceClosed = true;  
    }  
} 

"قمع=true" يشير إلى ما إذا كان GC.SuppressFinalize كان يسمى في Dipose الأسلوب.

ملخص

ل .صافي إزالة الكائن من finalizer طابور من خلال الاتصال GC.SuppressFinalize هو نصف تكلفة من ترك الاعتراض على قائمة الانتظار.

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