خط سلوك جامع البيانات المهملة (مستعيد الذاكرة)
لا يحتاج مبرمج Java إلى مراقبة تخصيص الذاكرة لأن جامع البيانات المهملة يدير الذاكرة تلقائيًا. يتم تشغيل أداة تجميع البيانات المهملة بواسطة Java Virtual Machine (JVM). أداة تجميع البيانات المهملة هي عملية ذات أولوية منخفضة يتم تشغيلها بشكل دوري وتقوم باستعادة الذاكرة المستخدمة بواسطة الكائنات التي لم تعد هناك حاجة إليها. تحتوي أجهزة JVM المختلفة على خوارزميات مختلفة لجمع البيانات المهملة. هناك العديد من الخوارزميات المستخدمة، على سبيل المثال: خوارزمية العد المرجعي أو خوارزميات الترميز والكشط.
تشغيل جامع البيانات المهملة في جافا
عادةً ما يقوم JVM بتشغيل أداة تجميع البيانات المهملة عندما تكون الذاكرة الحرة منخفضة. لكن تشغيل أداة تجميع البيانات المهملة لا يضمن وجود ذاكرة خالية كافية دائمًا. إذا لم تكن هناك ذاكرة كافية حتى بعد الاسترداد، فسيطرح JVM استثناء OutOfMemoryError. يرجى ملاحظة أنه يجب على JVM تشغيل أداة تجميع البيانات المهملة مرة واحدة على الأقل قبل طرح الاستثناء. يمكنك طلب تشغيل أداة تجميع البيانات المهملة في Java، لكن لا يمكنك فرض هذا الإجراء.
طلب تشغيل جامع القمامة
لتقديم طلب، يمكنك الاتصال بإحدى الطرق التالية:
System.gc()
Runtime.getRuntime().gc()
ملاءمة لتشغيل جامع القمامة
يجب التخلص من الكائن عندما لا يكون متاحًا للتيار الحي. قد يتم التخلص من الكائن في حالات مختلفة:
- إذا تم تعيين متغير من نوع المرجع الذي يشير إلى كائن على "0"، فيجب التخلص من الكائن إذا لم تكن هناك مراجع أخرى له.
- إذا تم إنشاء متغير من نوع مرجعي يشير إلى كائن للإشارة إلى كائن آخر، فيجب التخلص من الكائن إذا لم تكن هناك مراجع أخرى له.
- يتم تجاهل الكائنات التي تم إنشاؤها محليًا في طريقة ما عند خروج الطريقة، ما لم يتم تصديرها من تلك الطريقة (أي، يتم إرجاعها أو طرحها كاستثناء).
- قد تخضع الكائنات التي تشير إلى بعضها البعض للتخلص منها إذا لم يكن أي منها متاحًا للسلسلة المباشرة.
لنلقي نظرة على مثال:
public class TestGC
{
public static void main(String [] args)
{
Object o1 = new Integer(3);
Object o2 = new String("Tutorial");
o1 = o2;
o2 = null;
}
}
في هذا المثال
Integer
، يمكن التخلص من الكائن (العدد الصحيح) المشار إليه في الأصل بواسطة المؤشر o1 بعد السطر 3 لأن o1 يشير الآن إلى الكائن
String
(السلسلة). على الرغم من أن o2 تم إنشاؤه للإشارة إلى القيمة null، إلا أن الكائن
String
(السلسلة) غير قابل لإعادة التدوير نظرًا لأن o1 يشير إليه.
وضع اللمسات النهائية
تتيح لك تقنية Java استخدام طريقة
finalize()
(الإنهاء) لإجراء التنظيف اللازم قبل أن يقوم جامع البيانات المهملة باسترداد كائن من الذاكرة. يتم استدعاء هذه الطريقة على كائن بواسطة أداة تجميع البيانات المهملة عندما يحدد أداة تجميع البيانات المهملة أنه لم يعد هناك أي مراجع للكائن. وهذا موصوف في الفصل
Object
، مما يعني أنه موروث من قبل جميع الفئات. تتجاوز الفئة الفرعية الطريقة
finalize()
لتحرير نفسها من موارد النظام أو لإجراء عملية تنظيف أخرى:
protected void finalize() throws Throwable
إذا تم طرح استثناء غير مسجل بواسطة الطريقة
finalize()
، فسيتم تجاهل الاستثناء ويتوقف إنهاء هذا الكائن. سيتم استدعاء الطريقة
finalize()
مرة واحدة فقط خلال عمر الكائن. من الممكن استخدام طريقة
finalize()
على أي كائن لحمايته من التخلص منه. ولكن في هذه الحالة، لم يعد يتم تنشيط أداة تجميع مجمعي البيانات المهملة
finalize()
لهذا الكائن. سيتم دائمًا استدعاء الطريقة
finalize()
مرة واحدة قبل أن يتم جمع البيانات المهملة للكائن. ومع ذلك، فمن الممكن
finalize()
ألا يتم تفعيل الطريقة لكائن معين طوال مدة وجوده، لأنه قد لا يكون عرضة للتخلص منه.
ملخص
في هذا القسم، نظرنا إلى عملية جمع البيانات المهملة، وهي تقنية لإدارة الذاكرة في لغة جافا. لا يمكن إجبار جمع القمامة. لقد تعلمنا عن الطرق المختلفة لجعل الكائنات مؤهلة لإعادة التدوير وعلمنا أنه
finalize()
يتم استدعاء الطريقة قبل استعادة الكائن بواسطة جامع البيانات المهملة.
يمارس
سؤال: كم عدد الأشياء التي سيتم التخلص منها بعد السطر 7؟
public class TutorialGC
{
public static void main(String [] args)
{
Object a = new Integer(100);
Object b = new Long(100);
Object c = new String("100");
a = null;
a = c;
c = b;
b = a;
}
}
خيارات الإجابة: أ. 0 ب. 1 ج. 2 د. 3 هـ. لا يمكن تجميع الكود
الخيار الصحيح: ب
الشرح: من بين الكائنات الثلاثة التي تم إنشاؤها في الأسطر 1 و2 و3، يجب التخلص من الكائن فقط
Integer
عند نهاية السطر 7. المراجع المتغيرة، أ، التي تشير في الأصل إلى الكائن
Integer
، تشير إلى الكائن
String
في السطر 5. وبالتالي،
Integer
يجب التخلص من الكائن بعد السطر 5، نظرًا لعدم وجود متغيرات تشير إليه. المتغيرات
b
وتشير
c
إلى الأشياء
String
والأشياء
Long
في السطرين 6 و7، لذا فهي غير قابلة لإعادة التدوير.
GO TO FULL VERSION