Translated Text:
جمع القمامة في جافا هو أحد المواضيع المتقدمة. معرفة جافا GC تساعدنا في ضبط أداء تشغيل التطبيق الخاص بنا.
جمع القمامة في جافا
- في جافا ، لا يحتاج المبرمجون إلى الاعتناء بتدمير الكائنات التي لم تعد قيد الاستخدام. يعتني جمع القمامة بذلك.
- جمع القمامة هو خيط الشيطان الذي يعمل في الخلفية. في الأساس ، يقوم بحررة ذاكرة الكومة من خلال تدمير الكائنات غير المتاحة.
- الكائنات غير المتاحة هي تلك التي لم يعد يشير إليها أي جزء من البرنامج.
- يمكننا اختيار جامع القمامة لبرنامج جافا الخاص بنا من خلال خيارات JVM ، سنلقي نظرة على هذه في الجزء اللاحق من هذا البرنامج التعليمي.
كيفية عمل الجمع التلقائي للقمامة؟
{
“error”: “Upstream error…”
}
جافا جارباج كوليكتورز
يوفر JVM فعلاً أربعة جارباج كوليكتورز مختلفة، جميعها جيلية. لكل منها مزاياها وعيوبها الخاصة. الاختيار بين أي جارباج كوليكتور يترتب علينا وقد تكون هناك اختلافات كبيرة في معدل الناتج وتوقف التطبيق. كل هذه الخيارات، تقسم الذاكرة المدارة إلى أقسام مختلفة، باستخدام الافتراضات القديمة أن معظم الكائنات في الذاكرة قصيرة العمر ويجب إعادة تدويرها بسرعة. لذا، أنواع جارباج كوليكتورز الأربعة هي:
Serial GC
هذا هو أبسط جارباج كوليكتور، مصمم للأنظمة ذات الخيوط الواحدة وحجم الذاكرة الصغير. يجمد جميع التطبيقات أثناء العمل. يمكن تشغيله باستخدام الخيار -XX:+UseSerialGC للـ JVM.
Parallel/Throughput GC
هذا هو مجمع جافا الافتراضي في إصدار JDK 8. كما يشير اسمه، فإنه يستخدم مواضيع متعددة لفحص مساحة الذاكرة وأداء ضغط. إحدى عيوب هذا المجمع هي أنه يوقف مواضيع التطبيق أثناء أداء جمع القمامة البسيطة أو الكاملة. إنه مناسب تمامًا لتطبيقات يمكنها التعامل مع مثل هذه التوقفات، وتحاول تحسين العبء الناتج عن جمع القمامة.
جماعة جمع CMS
تستخدم خوارزمية جمع CMS (“concurrent-mark-sweep”) مواضيع متعددة (“concurrent”) لفحص الذاكرة (“mark”) بحثًا عن الكائنات غير المستخدمة التي يمكن إعادة تدويرها (“sweep”). يدخل هذا المجمع في وضع “توقف العالم” (STW) في حالتين: – أثناء بدء العلامة الأولية للجذور، أي الكائنات في الجيل القديم التي يمكن الوصول إليها من نقاط الدخول للمواضيع أو المتغيرات الثابتة – عندما يغير التطبيق حالة الذاكرة أثناء تشغيل الخوارزمية بشكل متزامن ويضطرها إلى الرجوع والقيام ببعض اللمسات النهائية للتأكد من أن لديها الكائنات المحددة بشكل صحيح. قد يواجه هذا المجمع فشل الترقية. إذا كانت بعض الكائنات من الجيل الشاب يجب نقلها إلى الجيل القديم، ولم يكن لدى المجمع ما يكفي من الوقت لتحرير مساحة في الجيل القديم، فسيحدث فشل في الترقية. من أجل منع ذلك، يمكننا توفير مزيد من حجم الذاكرة للجيل القديم أو توفير المزيد من المواضيع الخلفية للمجمع.
مجمع G1
؛ وأخيرًا وليس آخرًا، مجمع Garbage-First، مصمم لحجم الذاكرة التخزينية الذي يزيد عن 4 جيجابايت. يقسم حجم الذاكرة التخزينية إلى مناطق تمتد من 1 ميجابايت إلى 32 ميجابايت، استنادًا إلى حجم الذاكرة التخزينية. هناك مرحلة علامة عالمية متزامنة لتحديد حالة الأشياء عبر الذاكرة التخزينية. بعد اكتمال مرحلة العلامة، يعلم G1 أي المناطق فارغة تقريبًا. يجمع ال G1 الكائنات غير القابلة للوصول في هذه المناطق أولاً، مما يؤدي عادة إلى الحصول على كمية كبيرة من المساحة الفارغة. لذلك، يقوم G1 بجمع هذه المناطق (التي تحتوي على القمامة) أولاً، ومن هنا جاء اسم Garbage-First. يستخدم G1 أيضًا نموذج تنبؤ بالتوقف من أجل تحقيق هدف زمن التوقف المحدد من قبل المستخدم. يحدد عدد المناطق التي يجب جمعها استنادًا إلى هدف زمن التوقف المحدد. يتضمن دورة جمع القمامة ل G1 المراحل كما هو موضح في الشكل:
-
مرحلة الشباب فقط: تشمل هذه المرحلة فقط الكائنات في الجيل الشاب وترقيها إلى الجيل القديم. يبدأ انتقال بين مرحلة الشباب فقط ومرحلة استرداد المساحة عندما يكون الجيل القديم محتلًا حتى حد معين، أي عتبة احتلال الذاكرة التخزينية البادئة. في هذا الوقت، يقوم G1 بجدولة جمع الشباب فقط بعلامة بادئة بدلاً من جمع الشباب العادي.
-
العلامة الابتدائية: هذا النوع من الجمع يبدأ عملية العلامة بالإضافة إلى جمع شبابي عادي. يحدد العلامة المتزامنة جميع الكائنات الحية حاليًا في مناطق الجيل القديم للحفاظ عليها لمرحلة استرداد المساحة التالية. بينما لم يكتمل العلامة بالكامل، قد تحدث جمعات شبابية عادية. تنتهي عملية العلامة بتوقفين خاصين بالعالم: الريمارك والتنظيف.
-
الريمارك: هذا التوقف يكمل عملية العلامة ذاتها، ويقوم بمعالجة المراجع العالمية وتفريغ الفئات. بين الريمارك والتنظيف، يحسب G1 ملخصًا لمعلومات الحيوية بشكل متزامن، والتي سيتم استكمالها واستخدامها في توقف التنظيف لتحديث الهياكل البيانية الداخلية.
-
تنظيف: تأخذ هذه الوقفة أيضًا المناطق الفارغة تمامًا، وتحدد ما إذا كان سيتبع فعلا مرحلة استرداد المساحة. إذا تبعت مرحلة استرداد المساحة، تكتمل المرحلة الخاصة بالشباب بجمع واحد فقط للشباب.
-
مرحلة استرداد المساحة: تتكون هذه المرحلة من عدة مجموعات مختلطة – بالإضافة إلى مناطق الجيل الشاب، تخلي أيضًا مناطق الجيل القديم من الكائنات الحية. تنتهي مرحلة استرداد المساحة عندما يحدد G1 أن إخلاء المزيد من مناطق الجيل القديم لن يؤدي إلى حرية مساحة كافية تستحق الجهد.
لا يمكن تفعيل G1 باستخدام العلم `–XX:+UseG1GC
`. هذا الاستراتيجية تقلل من احتمال نفاد الذاكرة قبل الانتهاء من مسح الخلفية للكائنات غير المتاحة. أيضًا، تضغط الذاكرة على الطاير، الأمر الذي يمكن أن يقوم به جامع CMS فقط في وضع STW. في جافا 8، تم توفير تحسين جميل مع جامع G1، يُعرف بـ تكرار السلاسل. كما نعلم، تشغل مصفوفات الأحرف التي تمثل سلاسلنا الكثير من مساحة الذاكرة. تم إجراء تحسين جديد يمكن جامع G1 من التعرف على السلاسل المكررة أكثر من مرة عبر الذاكرة الخاصة بنا وتعديلها لتشير إلى نفس مصفوفة char[] داخلية، لتجنب وجود نسخ متعددة من نفس السلسلة في الذاكرة بشكل غير ضروري. يمكننا استخدام العلم `-XX:+UseStringDeduplication
` لتمكين هذا التحسين. G1 هو جامع القمامة الافتراضي في JDK 9.
جافا 8 PermGen وMetaspace
كما ذُكر سابقًا، تم إزالة مساحة Permanent Generation منذ Java 8. لذلك، يستخدم JDK 8 HotSpot JVM الذاكرة الوطنية الآن لتمثيل بيانات الفئة والتي تُسمى Metaspace. يتم إجراء معظم التخصيصات لبيانات الفئة من الذاكرة الوطنية. أيضًا، هناك علامة جديدة تسمى MaxMetaspaceSize، لتحديد حجم الذاكرة المستخدمة لبيانات الفئة. إذا لم نحدد قيمة لهذا، يتم تغيير حجم Metaspace أثناء التشغيل وفقًا لاحتياج تطبيق التشغيل. يتم تشغيل جمع القمامة في Metaspace عندما يصل استخدام بيانات الفئة إلى حدود MaxMetaspaceSize. قد يكون الجمع الزائد للقمامة في Metaspace عرضة للفئات، تسريب ذاكرة المحملات الفئة أو تحجيم غير كافٍ لتطبيقنا. وهذا هو كل شيء بخصوص جمع القمامة في جافا. آمل أن تكون قد فهمت مفهوم الجامعين المختلفين لدينا في جافا. المراجع: توثيق Oracle، G1 GC.
Source:
https://www.digitalocean.com/community/tutorials/garbage-collection-in-java