ما هي العلاقة بين GC ، اللمسات الأخيرة () والتخلص؟

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

  •  23-09-2019
  •  | 
  •  

سؤال

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

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

المحلول

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

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

يجب أن يطلق على التخلص بشكل صريح على نوع ينفذ IDisposable. يمكن أن يسمى إما من خلال Dispose() الطريقة نفسها أو عبر using بناء. لن يتصل GC بالتخلص تلقائيًا.

من ناحية أخرى ، سيتم استدعاء المزروع النهائي أو المدمر (كما تسميها مواصفات اللغة) بعض الاحيان بعد أن كان الكائن مؤهلاً للتنظيف. يتم تنفيذ الأساليب النهائية بالتتابع على موضوع مخصص.

Dispose() يسمح بالتنظيف الحتمي للموارد بينما يمكن أن يعمل Finalizer كشبكة أمان في حالة عدم الاتصال بالمستخدم Dispose().

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

إذا كنت تريد البحث في هذا ، أوصي CLR عبر C# بواسطة Jeffrey Richter. إنه كتاب رائع ويغطي جميع التفاصيل المذهلة لهذا (تركت عددًا من التفاصيل). تم إصدار الطبعة الثالثة الجديدة للتو.

نصائح أخرى

واحدة من فوائد .NET هي جامع القمامة. في العديد من اللغات ، يجب أن تتم إدارة كل قطعة من الذاكرة من قبل المطور- يجب في النهاية إصدار أي ذاكرة مخصصة. في .NET (C#) ، سيهتم جامع القمامة (GC) بعملية إطلاق الذاكرة لك. إنه يتتبع استخدام كائناتك ، وبعد أن تصبح "غير مجردة" (أي: لا توجد مراجع داخل تطبيقك إلى هذا الكائن ، بشكل مباشر أو غير مباشر) ، يتم تنظيف ذاكرة الكائن تلقائيًا.

التخلص ، أو أكثر على وجه الخصوص ، IDisposable والنمط التخلص ، يستخدم للتعامل مع الموارد بشكل منفصل عن GC. بعض الموارد يجب أن تكون تم تنظيفها بشكل صريح, ، لأسباب مختلفة. يتضمن ذلك استخدام واجهة برمجة تطبيقات "أصلية" (حيث IDisposable والنمط التخلص.

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

تكمن المشكلة في معظم العينات في أن هناك أسباب متعددة لاستخدام Idisposable ، ويختلف التنفيذ المناسب اعتمادًا على سبب استخدامك له. على سبيل المثال ، إذا قمت بلف مورد أصلي مباشرةً ، فيجب عليك تنفيذ Finalizer ، ولكن إذا قمت بتغليف نوع آخر قابل للاستمتاع ، فليس من الضروري أن يكون هناك ضروري ، على الرغم من أنه لا يزال يتعين عليك تطبيق Idisposable. من أجل معالجة هذا ، كتبت عنه idisposable والانتهاء بتعمق على مدونتي, ، وصف الأسباب المتعددة التي يمكنك استخدامها idisposable ، وأنماط مختلفة لأسباب مختلفة.

قد ترغب فقط في قراءة ما أعتبره المقال النهائي حول Idisposable و Finalizers و Garbage Collection ، Shawn Farkas ' CLR Inside Out: Digning to Idisposable.

هذا المقال لا يترك القليل من الشك حول هذا الموضوع.

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