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

سؤال: بخصوص GarbageCollection

مغلق
بدأه محمد سامر أبو سلو في 1 أكتوبر 2005 · 8 رد · 869 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

قرأت في أحد الكتب الطريقة التالية لإتاحة المزيد من الذاكرة للتطبيقات التي تستخدم الدوت نيت فرايموورك

            GC.Collect()
            GC.WaitForPendingFinalizers()

حيث أن الأمر الأول يجبر الفريم وورك على تنفيذ garbage collection وبذلك يتخلص من جميع المتغيرات والكلاسات المنتهية والتي تبقى في الذاكرة المشتركة لتطبيقات الفريموورك حتى ينفذ النظام عملية Garbage Collection والتي لايمكنك التنبؤ متى سيقوم النظام بتنفيذها لأنها تتم بشكل آلي تماما من قبل النظام

والأمر الثاني يوقف تنفيذ المسار الحالي Current Thread حتى تنتهي العملية

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

مع ملاحظة أن هذه العملية تتم - وإن كنت قد نفذتها من داخل برنامجك - على مستوى الفريموورك ككل أي أن جميع التطبيقات التي تستخدم الفريموورك في وقت تنفيذها ستتأثر بشكل أو بآخر بالعملية

ولكن من الناحية العملية قمت بتجربة هذه العملية على برنامج يعطي رسائل خطأ غير متوقعة - مثل لايوجد ذاكرة كافية - في أوقات غير متوقعة وبدون أسباب ظاهرة - مع أن الجهاز الذي تتم عليه التجربة به 512 ميغا رامات - وعندما تتم تجربة البرنامج ضمن بيئة التطوير واستخدام الـ debug لمحاولة حصر المشكلة يعمل البرنامج بشكل سليم واستخدام هذه العملية ضمن أماكن معينة ضمن البرنامج قام بحل مشكلة رسائل الخطأ تلك

السؤال هنا

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

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#2

الافضل ان تتركgc يقوم بعمله دون اى تدخل منك

والله اعلم

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#3

انا اول مرة اعرف انه يمكن التحكم بجامع النفايات garbage collection بالكود .

لكن اخي الكريم اعتقد طالما انه يمكن ذلك فهي كما ذكرت انت في مشاركتك من وجهة نضري وهي

عندما يكون البرنامج في حالة الإنتظار .

يمكن ايضا في حال كان البرنامج كبير وفية متغيرات جدا كثيرة فيمكنك بعد الإنتها من العملية المعنية ان تقوم بإستدعاء garbage collection .

لكن تضل المشكلة اعتقد انها تكمن في مشكلة إعادة تعريف المتغيرات مرة اخرة في الذاكرة مما قد يسبب بطئ في البرنامج .

فعلاً انها محيرة نوعاً ما .

لكن جرب ان تعطي برنامجك أولوية في المعالجة إن كانت تشعر انه بطيئ , نتمنا من الإخوة من لدية فكرة عن هذا الموضوع المشاركة.

#4

@ أخ SOLO.NET

أنا أتفق معك في أنه في الحالات العامة يجب ترك النظام يقوم بعمله دون تدخل

ولكن طالما الأمر موجود معناها هناك حالات ستضطر لاستخدامه وإلا لما أتاحته مايكروسوفت للمبرمجين ووثقته في وثائق بيئة البرمجة

ويبقى سؤالي مطروحا

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

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#5

@ اخ فواز الشمري

بالنسبة للمتغيرات التي مازات قيد الحياة ولم يتم التخلص منها Disposed هذه العملية لاتؤثر عليها مطلقا

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#6
اقتباس
الافضل ان تتركgc يقوم بعمله دون اى تدخل منك

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

والله الموفق

#7

@ أخ Ammar Gaffar

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

طبعا عندما أستخدم هذا الأمر سيكون في برنامج أقوم أنا بكتابته وبهذا أعرف تماما آلية عمل البرنامج ولكن مجال النقاش هنا هو كيف أستطيع تحديد المناطق التي يمكن استخدام هذا الأمر فيها بشكل آمن وخصوصا أنني أشرت إلى أن هذا الأمر خلصني من مشكلة أحاول منذ شهر التخلص منها دون فائدة

اقتباس
ولكن من الناحية العملية قمت بتجربة هذه العملية على برنامج يعطي رسائل خطأ غير متوقعة - مثل لايوجد ذاكرة كافية - في أوقات غير متوقعة وبدون أسباب ظاهرة - مع أن الجهاز الذي تتم عليه التجربة به 512 ميغا رامات - وعندما تتم تجربة البرنامج ضمن بيئة التطوير واستخدام الـ debug لمحاولة حصر المشكلة يعمل البرنامج بشكل سليم واستخدام هذه العملية ضمن أماكن معينة ضمن البرنامج قام بحل مشكلة رسائل الخطأ تلك

وإذا لاحظت في جوابي سابقا

اقتباس
@ أخ SOLO.NET

أنا أتفق معك في أنه في الحالات العامة يجب ترك النظام يقوم بعمله دون تدخل

ولكن طالما الأمر موجود معناها هناك حالات ستضطر لاستخدامه وإلا لما أتاحته مايكروسوفت للمبرمجين ووثقته في وثائق بيئة البرمجة

ويبقى سؤالي مطروحا

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

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#8

أخي محمد

كما ذكر الأخوة الافضل ترك ال GC يقوم بعمله بدون تدخله،

ال Thread الخاص GC تكون الاولوية له low في الوضع العادي لكنها تنتقل الى high تلقائياً عندما يصبح الجهاز في الوضع الخامل Idle او عندما يكون هناك ضمور في الذاكرة او الموارد الخاصة بالجهاز، او عندما تقوم بإستدعائه بشكل مباشرة مثل المثال الذى ذكرته

طبعا عندما يعمل سوف يأثر ذلك على اداء البرنامج، لذلك يفضل ان لا تقوم بإستدعائه بشكل مباشر في اغلب الحالات لان ذلك سوف يؤثر بشكل عكسي على برنامجك

اما في الحالات التى تريد إستخدامه، فعند استخداك لمجموعة كبيرة من الاوبجكت وعند الانتهاء منها وتريد التاكد انك تريد استراجاع الذاكرة لها فإستخدامها

ايضا في الحالات التى تتعامل بها مع Com ويكون لديك كثير من الاستخدام معها، قد تستخدمها حتى تقوم بإسترجاع الذاكرة التى حجزت من خلال ال RCW والغاء اي refernces بها

وهناك حالات اخرى مشابهة لما ذكرت في الحالاتين، لكن في كل الاحوال الافضل عندهم استخدمه ان لم تكون متأكد انك تستطيع استخدامه في المكان الصحيح

ايضا حتى يعمل الكود الذى ذكرته بشكل كامل، قد تحتاج الى استدعائه اكثر من مرة بشكل متتابع

لا تحزن:

إن كنت فقيرا فغيرك محبوس في دين، وإن كنت لا تملك وسيلة نقل فسواك مبتور القدمين، وان كنت تشكوا من آلام فغيرك يرقدون على الاسرة البيضاء و من سنوات، وان فقدت ولدا فغيرك فقد عددا من الأولاد و في حادث واحد.

لا تحزن:

فأنت تشرب الماء الزلال، و تستنشق الهواء الطلق، و تمشي على قدميك معافى، و تنام ليلك آمنا.

#9

شكرا لك أخ محمد نسمان

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

هذا الموضوع مغلق.

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