مالفرق الجوهري بين garbage collection في Java و c#

من فترة كنت اتناقش مع احد الاصدقاء عن الفرق بين Java و c#

فدخلنا في موضوع garbage collection واخبرني انها في الجافا ممتازة وافضل بكثير من الموجودة في C#

فهل كلامه صحيح ومالفرق في طريقة عملها كليهما


معرفتي حول ال Java Hotspot/GC وسأتحدث قليلاً فيه..

في جافا يستخدم ال GC فكرة Generational Garbage Collector ، وهذه الفكرة تعتمد على نظرية أن اغلب الكائنات التي تنشئها في التطبيق تنتهي بسرعه (تصبح Unreachable objects) وفقط هناك مجموعه قليله من الكائنات تظل موجودة في التطبيق ويكون عمرها اطول Younger Objects فلا تنتهي بسرعه، حتى الذاكرة قسمت لعدة اجزاء The Young Generation و The Old Generation بناء على هذه النظرية (طبعاً هناك تفاصيل كثيرة جداً وراء ذلك).

المهم الذي يميز في ال HotSpot VM أن هناك كثير من الخورازميات التي تستطيع استخدامها واختيارها عندما يعمل برنامجك، الى درجة يمكن أن يكون لكل Generation في الذاكرة خوارزمية GC خاصه فيه بناء على طريقة عمله، مثلاً:

 * في الYoung Generation يتم اختيار خوارزمية GC سريعه ولذلك لأن عملية Minor GC تكون متكررة دائماً ولا يهتم كثيراً لكون الخوارزمية تستهلك مساحة هي الأخرى في الذاكرة وذلك لأن Young Generation هي منطقة صغيرة هي الأخرى

  • في ال Old Generation يتم اختيار خوارزمية تستخدم الذاكرة بشكل جيد ولا يهتم كثيراً بسرعتها والسبب هو أن عمليات ال Full GC قليله وبالتالي لن تؤثر على اداء التطبيق

طبعاً كلما كبر البرنامج أحتاج الأمر الى دراسة وTuning بشكل أفضل.

الذي أعرفه ال C# GC أنه أقل مرونة من ناحية تخصيص خورازميات ال GC قبل تشغيل البرنامج مثل الجافا.

عادة لا أحبذ مواضيع ما الفرق، لأن هذه المواضيع هي الأصعب في الاجابة الصحيحة، ولن يفهمها اي شخص حتى بعد الاجابة لأنها تحتاج خبرة لأن الفروق دائماً في التفاصيل devil in details، لذلك لا فائدة كبيرة منها الا للInternal Developers الذين يعملوا على GC Algorithms، الأفضل للمبرمجين ان يتناقشوا حول "كيف يعمل" وليس "ما الفرق" لأن الأخير غالباً لا يوجد من يستطيع ان يجيب عليه.

شكراً لك اخي على التفصيل

ايضا هل يوجد فارق كبير مابين JVM و CLR بما ان كلاهما يتحدث بشكل دوري

من الممكن ياتي ووقت ويمتلك كليهما نفس الخصائص