يتم إنشاء الكائنات باستخدام جديد ، ولكن لا توجد عملية حذف مقابلة لإعادة تدوير الذاكرة التي يحتلها الكائن. عندما نكممل استخدام كائن ما ، نتوقف ببساطة عن الإشارة إلى هذا الكائن: تغيير مرجعنا إلى النقطة إلى كائن آخر أو إلى فارغ ؛ أو العودة من الطريقة بحيث لم تعد المتغيرات المحلية للطريقة موجودة ، بحيث تصبح الإشارة إلى هذه المتغيرات المحلية لا تشير إلى أي كائن. تسمى الكائنات التي لم تعد تمت الإشارة إليها القمامة. تسمى عملية العثور على هذه الكائنات وإعادة تدويرها
تستخدم أجهزة Java Virtual Active مجموعة Garbage للتأكد من أن الكائنات المرجعية سيتم الاحتفاظ بها في الذاكرة ، وستقوم أيضًا بتحرير مساحة التخزين التي تشغلها كائنات لا يمكن الوصول إليها من خلال أي مرجع في رمز التنفيذ. هذا ضمان قوي أنه إذا لم تتم إعادة تدوير كائن إذا بدأت السلسلة المرجعية من مرجع الجذر (أي المراجع التي يمكن الوصول إليها مباشرة في رمز التنفيذ).
باختصار ، عندما لا يمكننا الوصول إلى كائن من أي رمز قابل للتنفيذ ، يمكن إعادة تدوير المساحة التي يستغرقها. لاحظ أننا نستخدم كلمة "CAN" لأنه ما إذا كان يتم تحديد مساحة الذاكرة بواسطة جامع القمامة. بشكل عام ، سيتم تشغيل جامع القمامة فقط إذا كانت هناك حاجة إلى مزيد من مساحة الذاكرة أو لتجنب تدفق الذاكرة. ومع ذلك ، قد يخرج البرنامج دون تجاوز الذاكرة ، أو حتى عندما لا يكون قريبًا من تدفق الذاكرة ، لذلك قد لا يتطلب جمع القمامة على الإطلاق. في جميع الطرق التي تم تنفيذها حاليًا ، إذا كانت جميع المتغيرات تحتوي على إشارات إلى كائن ، والبدء من هذه المتغيرات ، لا يمكن العثور على إشارات إلى هذا الكائن في جميع المجالات أو عناصر الصفيف على طول السلسلة المرجعية ، ثم نقول أن الكائن "لا يمكن الوصول إليه".
إعادة تدوير القمامة تعني أننا لا نضطر إلى القلق أبدًا بشأن تعلق المراجع. في الأنظمة التي يمكن للمبرمجين التحكم فيها بشكل مباشر عند حذف الكائنات ، يمكن للمبرمجين حذف الكائنات التي لا تزال الكائنات الأخرى تشير إليها. إذا قام المبرمجون بحذف مثل هذه الكائنات ، فإن المراجع التي لا تزال تشير إلى الكائنات المحذوفة ستصبح باطلة لأنها تشير إلى الصمت.
يعتبر النظام أنه مساحة ذاكرة قابلة للتخصيص (ولكن في الواقع تم إصدار المساحة). يمكن للنظام تخصيص هذه المساحة المخصصة للكائنات الجديدة ، بحيث تؤدي المراجع التي تشير في الأصل إلى المساحة إلى كائنات مختلفة تمامًا عما توقعوا. في هذه الحالة ، قد تحدث الكوارث التي لا يمكن التنبؤ بها عندما يستخدم البرنامج القيم المخزنة في هذا الفضاء ويديرها ككائنات لا ينتمون إليها. تحل مجموعة Garbage مشكلة تعليق المراجع بالنسبة لنا ، لأن جميع الكائنات التي لا تزال مشار إليها لن يتم التعامل معها على أنها جمع القمامة ، وبالتالي لا يمكن تحرير المساحة التي يشغلونها. يحل جمع القمامة أيضًا مشكلة حذف الكائن نفسه عدة مرات - يمكن أن تسبب هذه المشكلة أيضًا كوارث. لا تتطلب إعادة تدوير كائنات القمامة تدخلنا ، لكن إعادة تدوير القمامة ستشغل كمية معينة من موارد النظام. يمكن أن يتداخل إنشاء وإعادة تدوير أعداد كبيرة من الكائنات مع التطبيقات الزمنية المحددة ، لذلك عند تصميم هذه الأنظمة ، يجب أن نتعامل بعناية مع عدد الكائنات التي تم إنشاؤها من أجل تقليل مقدار القمامة المراد إعادة تدويرها.
لا يضمن جمع القمامة أن الذاكرة ستحصل دائمًا على مساحة لإنشاء كائنات جديدة. على سبيل المثال ، إذا واصلنا إنشاء كائنات ووضعها في قائمة ، لم يعد بإمكاننا إنشاء كائنات جديدة عندما لا تكون هناك مساحة كافية لإنشاء كائنات جديدة ولا توجد كائنات غير مرجعية. إذا احتفظنا بالإشارات القائمة أعلاه إلى الكائنات التي لم تعد مطلوبة ، فسيحدث تسرب الذاكرة. مجموعة القمامة تحل العديد من مشاكل تخصيص الذاكرة (ولكن ليس كلها).
تتفاعل مع جامع القمامة
على الرغم من أن لغة Java نفسها لا تملك أي طريقة واضحة للتخلص من الكائنات الخاملة ، إلا أنه لا يزال بإمكاننا العثور على كائنات لم تعد تستخدم عن طريق استدعاء جامع القمامة مباشرة. تتيح لنا بعض الأساليب المريحة في فئة وقت التشغيل وفئة النظام الاتصال بجامع القمامة ، أو طلب تشغيل جميع المحركات النهائية لتشغيلها ، أو عرض حالة الذاكرة الحالية:
.
.
"الحرية الطويلة العامة (): إرجاع العدد المقدر للبايت المتاح في ذاكرة النظام.
・ Memory Total Total Public: إرجاع العدد الإجمالي للبايت في ذاكرة النظام.
.Public Long MaxMemoryo: إرجاع الحد الأقصى لعدد بايت من ذاكرة النظام المتاحة للجهاز الظاهري Java. إذا كان نظام التشغيل لا يحتوي على قيود على استخدام الذاكرة على الأجهزة الافتراضية Java ، طويلة. سيتم إرجاع القيمة القصوى. لا توجد طريقة في Java لتعيين الحد الأقصى للذاكرة للنظام. عادة ، تقوم أجهزة Java الظاهرية بتعيين هذه القيمة من خلال سطر الأوامر أو خيارات التكوين الأخرى.
لاستدعاء الطريقة أعلاه ، نحتاج إلى الحصول على مرجع إلى كائن وقت التشغيل الحالي من خلال وقت تشغيل الطريقة الثابتة. تدعم فئة النظام أساليب GC الثابتة وطرق التكنولوجيا ، والتي ستستدعي الطرق المقابلة على كائن Runt-Im الحالي ؛ بمعنى آخر ، تعادل System.gc () لطرق Runtime.getRuntime (). GC ().
عند الاتصال بطريقة Runtime.gc () ، قد لا يجوز لمجمع القمامة تحرير أي ذاكرة إضافية ، لأنه قد لا تكون هناك قمامة لإعادة تدويرها ، ولا يمكن لجميع جامعي القمامة اكتشاف كائنات قابلة لإعادة التدوير عند الطلب. لذلك قد لا يكون لاستدعاء جامع القمامة أي تأثير. ومع ذلك ، فإن استدعاء طريقة التشغيل. gc () أمر مرغوب فيه قبل إنشاء عدد كبير من الكائنات ، وخاصة في التطبيقات المحددة الزمنية التي قد تؤثر عليها جمع القمامة. هناك فوائد محتملة لتنفيذها: الأول هو أنه يمكننا الحصول على أكبر قدر ممكن من الذاكرة قبل تشغيل التطبيق ، والثاني هو أنه يمكننا تقليل إمكانية تشغيل جامع القمامة أثناء تنفيذ المهام. تُصدر الطريقة التالية بنشاط جميع المساحات التي يمكن إصدارها في وقت التشغيل:
public static vo recordful1gc () {runtime rt = runtime.getRuntime () ؛ long isfree = rt.freememory () ؛ طويل الأمد do {wasfree = isfree ؛ rt.runfinalization () ؛ RT.GC () ؛ isfree two rt.freememory () ؛ } بينما (isfree> wasfree) ؛ }تتمثل هذه الطريقة باستمرار في الحلقات ، وتستمر قيمة Freememory في الزيادة عن طريق استدعاء أساليب التكاليف و GC باستمرار. عندما لا تعود كمية الذاكرة الحرة ، تنتهي حلقة الطريقة.
عادةً ما لا نحتاج إلى استدعاء طريقة التداول لأن طريقة الانتهاء تسمى بشكل غير متزامن من قبل جامع القمامة. في بعض الحالات ، على سبيل المثال ، عندما يتم استنفاد المورد الذي يمكن إعادة تدويره بواسطة طريقة اللمسات الأخيرة ، سيكون من المفيد تطبيق أكبر عدد ممكن من الإنهاءات عن طريق استدعاء التلال. لكن تذكر أنه لا يمكننا ضمان أن أي كائن ينتظر إنهاءه هو استخدام هذا المورد ، لذلك قد لا يكون للتشويش أي تأثير.
تبدو طريقة FullGC جذرية للغاية بالنسبة لمعظم التطبيقات. في الحالات الخاصة التي يلزم فيها جمع القمامة ، حتى لو لم يكن جميع القمامة المتاحة يتم جمعها عن طريق مكالمة واحدة إلى طريقة system.gc ، فهي الغالبية العظمى منها. لذلك ، ستقلل المكالمات المتكررة من معدل إخراج جمع القمامة ، وفي العديد من الأنظمة ، تكون هذه المكالمات المتكررة بدون إخراج.