الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Garbag Collector في الجافا ؟؟

بدأه زيد الرافدين في 6 أكتوبر 2008 · 6 رد · 1,381 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدي سؤال حول Garbage Collector في الجافا

نعلم في الجافا هنالك Garbage Collector يقوم بمهام السيطرة على الميموري RAM ويقوم بالتخلص من ال Objects التي لم يعد لها حاجة

لكن سؤالي

هل هنالك للتخلص من Object برمجيا من دون انتظار عمل Garbage Collector ليقوم بذلك العمل

فمثلا في الدوت نت لايمكن ذلك .. واقصى ماتستطيع عمله هو قطع العلاقة بين Object في الــ Heap مع الــ Reference في Stack

وانتظار Garbage Collector لكي يزيل Object من الــ Heap

تحياتي

تم تعديل هذه المشاركة بواسطة زيد الرافدين في 6 أكتوبر 2008 في 14:08

#2

على حسب معرفتي القليله ، أنت لا تستطيع أبدا معرفه متى ينتهي الكائن عمله -Die- حتى يقوم الـ GC بارجاع المساحه للذاكره .. ولا تستطيع حذف الكائن Kill كما في سي++ ... هذا الأمر من مهمه الـ GC .

وهذه من الميزات :) ، حيث كل ما عليك أن تنشىء الكائن وانسى موضوع حذفه تماما ..

لكن بعض الأحيان يكون الكائن مرتبط بـ Resource معينه مثلا ملف File سوكت Socket أو أي مصدر أخر ، ففي هذه الحاله عليك أن تتعامل معها (تغلقها) عند الأنتهاء منها ، حتى لا يقوم الGC بالتعامل معها وربما تحصل مشاكل حينها .

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

كما أننا لا نعرف متى سوف ينتهي عمل الكائن ، لذلك قد تكون وضعت كود اغلاق المصدر في finalize والى الأن يوجد Reference لهذا الكائن بالذاكره وبالتالي يكون المصدر متاح وأنت متوقع العكس .. لذلك التعامل بشكل يدوي واغلاق المصادر فور الأنتهاء منها هو أفضل وأسهل حل :) .

على العموم يمكنك أن تستدعى الـ GC في أي لحظه ، لكن قد يقوم بحذف كائنك وقد لا يقوم في تلك المره ، هذا يرجع للـ Implementation الخاص بGC .

هنا مثال جيد على استدعاء CG لحذف الكائن -المصوفه- المعرفه local داخل الداله ، وسوف ترى حجم الذاكره أصبحت كما قبل عمليه الحجز وهو دليل على عمل ألـGc :

Using the Runtime method to invoke the garbage collector

روابط أخرى مفيده :

How to Handle Java Finalization's Memory-Retention Issues

Object Finalization and Cleanup

Garbage collection and performance

Garbage Collection

بالتوفيق ،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#3
Wajdy Essam كتب:

على حسب معرفتي القليله ، أنت لا تستطيع أبدا معرفه متى ينتهي الكائن عمله -Die- حتى يقوم الـ GC بارجاع المساحه للذاكره .. ولا تستطيع حذف الكائن Kill كما في سي++ ... هذا الأمر من مهمه الـ GC .

وهذه من الميزات :) ، حيث كل ما عليك أن تنشىء الكائن وانسى موضوع حذفه تماما ..

لكن بعض الأحيان يكون الكائن مرتبط بـ Resource معينه مثلا ملف File سوكت Socket أو أي مصدر أخر ، ففي هذه الحاله عليك أن تتعامل معها (تغلقها) عند الأنتهاء منها ، حتى لا يقوم الGC بالتعامل معها وربما تحصل مشاكل حينها .

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

كما أننا لا نعرف متى سوف ينتهي عمل الكائن ، لذلك قد تكون وضعت كود اغلاق المصدر في finalize والى الأن يوجد Reference لهذا الكائن بالذاكره وبالتالي يكون المصدر متاح وأنت متوقع العكس .. لذلك التعامل بشكل يدوي واغلاق المصادر فور الأنتهاء منها هو أفضل وأسهل حل :) .

على العموم يمكنك أن تستدعى الـ GC في أي لحظه ، لكن قد يقوم بحذف كائنك وقد لا يقوم في تلك المره ، هذا يرجع للـ Implementation الخاص بGC .

هنا مثال جيد على استدعاء CG لحذف الكائن -المصوفه- المعرفه local داخل الداله ، وسوف ترى حجم الذاكره أصبحت كما قبل عمليه الحجز وهو دليل على عمل ألـGc :

Using the Runtime method to invoke the garbage collector

روابط أخرى مفيده :

How to Handle Java Finalization's Memory-Retention Issues

Object Finalization and Cleanup

Garbage collection and performance

Garbage Collection

بالتوفيق ،

شكرا يا اخ Wajdy Essam على الرد والشرح المفصل

كفيت ووفيت :lol:

لكن اتمنى ان ياكد لي احد خبراء الجافا سؤالي حول الجافا

شكرا

#4

سلام

اقتباس
هل هنالك للتخلص من Object برمجيا من دون انتظار عمل Garbage Collector ليقوم بذلك العمل

لا .... كل الي تقدر تسوية هو انك تخلي كل ال references الي تشير لل object تساوي null

و تطلب ال Garbage Collector و الباقي على ال implementation تبعة الي تحدد متى يعمل وكيف .

ملاحظة : مسموح لل implementation تبع ال Garbage Collector انها ما تسوي اي شي

#5

شكرا على الرد

#6

كلام الاخ Wajdy Essam صحيح ...وكفى ووفى ....كذلك حتى لو وضعت Garbage Collector فان وضعك له هو اقتراح للjvm قد ياخذ به ...

#7

السلام عليكم

أخ زين الرافدين

الأخ وجدي وسيم يعد من خبرائنا المعدودين

بصراحة أستغرب من الإدارة عدم ضمه إلى مجموعة خبراء الجافا

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

مواضيع مشابهة