لغة سي++ فيها شيء اسمه Destructor مثل مافيه Constructor. الConstructor هو الميثود اللي يبنى به الObject من الكلاس و الDestructor هو اللي يلغي او يحذف. هذا معناه اي Object تبنيه عليك انك تلغيه بنفسك و إلا امتلأت الذاكرة.
(سلسلة مفاهيم عن الGarbage Collection و الذاكرة)
(سلسلة مفاهيم عن الGarbage Collection و الذاكرة)
جافا و بعدها سي شارب و غيرها من اللغات حاولوا التسهيل على المبرمج بتضمين الGarbage Collector اللي هو جزء من ادارة الذاكرة في الJVM الخاص بجافا او الCLR الخاص بدوت نت. الGC قديم من الخمسينات كان اول ما ظهر في لغة Lisp.
كثير يفهم الGC انه اداة تراقب الObjects غير المستخدمة و يلغيها , لكن الواقع يحدث العكس فالGC يراقب ما يستخدم و يعتبر غيره Garbage.
لما يشتغل البرنامج يقوم الGC بحجز جزء متقارب من الذاكرة يسمى Managed Heap و يستخدمه للObjects. بمعنى انه يقوم بإدارة الPointers اللي كانت في سي++ و جافا اخفتها عن المستخدم. و تقوم بعمل Stack خاص بحيث كل Object جديد يأتي مباشرة بعد اخر Object اضافه.
يستمر الGC في الحجز مادام فيه مساحة في الذاكرة حتى تمتليء فإذا امتلئت عاد و بحث عن الأماكن الفارغة.
التعامل مع الManaged Heap اسرع من ان البرنامج يخلق الObjects في اماكن عشوائية في الذاكرة حيث ان الManaged Heap يكون تقريباً بسرعة الStack.
التعامل مع الManaged Heap اسرع من ان البرنامج يخلق الObjects في اماكن عشوائية في الذاكرة حيث ان الManaged Heap يكون تقريباً بسرعة الStack.
مراقبة الGC للObject شجرية تبدأ بشيء اسمه GC Roots و الObject تكون كالاوراق و ما يسقط منها يعتبر Garbage. شيء اخر مهم و هو انه عند تشغيل البرنامج و قيام الJVM مثلا بحجز جزء في الذاكرة ( Heap ) للObjects فإنه عند عملية التنظيف لا يعيد شيء للنظام و انما يعيد استخدامه.
هذا مع الوقت يخلق فراغات في الHeap فيقوم الGC بعملية Defragment يعيد ترتيب و صف الHeap.
الGC ما يشتغل بلاش. ياخذ أجره على حساب الذاكرة و الأداء و كلما كانت الObjects اللي يراقبها أقل كلما كان اسرع و اقل تكلفة على أداء البرنامج ككل.
الGC ما يشتغل بلاش. ياخذ أجره على حساب الذاكرة و الأداء و كلما كانت الObjects اللي يراقبها أقل كلما كان اسرع و اقل تكلفة على أداء البرنامج ككل.
ليه المحاضرة المملة هذي ؟ لاحظ ان المشكلة هي عدم وجود Destructor في جافا و سي شارب مثا لكن هناك بديل له و هو الDispose. ضروري في كل كلاس تبنيه انك تسوي ميثود Dispose تلغي فيه الObject مثل انك تعمل Close لملف او لكونكشن هذا يسرع عمل الGC.
او يمكنك استخدام Dispose مباشرة في جملة Try في جزء finally. او الأفضل انك تستخدم جملة Using. فائدة Using انها مباشرة تنادي ميثود Dispose بشكل اوتوماتيكي. هذي كل الحكاية.
جاري تحميل الاقتراحات...