logo

إدارة الذاكرة في جافا

في Java، إدارة الذاكرة هي عملية تخصيص وإلغاء تخصيص الكائنات، وتسمى إدارة الذاكرة. تقوم Java بإدارة الذاكرة تلقائيًا. تستخدم Java نظامًا تلقائيًا لإدارة الذاكرة يسمى a جامع القمامة . وبالتالي، لسنا مطالبين بتنفيذ منطق إدارة الذاكرة في تطبيقنا. تنقسم إدارة ذاكرة Java إلى قسمين رئيسيين:

    هيكل ذاكرة JVM عمل جامع القمامة

هيكل ذاكرة JVM

يقوم JVM بإنشاء مناطق بيانات مختلفة لوقت التشغيل في الكومة. يتم استخدام هذه المناطق أثناء تنفيذ البرنامج. يتم تدمير مناطق الذاكرة عند خروج JVM، بينما يتم تدمير مناطق البيانات عند خروج مؤشر الترابط.

إدارة الذاكرة في جافا

منطقة الطريقة

تعد منطقة الطريقة جزءًا من ذاكرة الكومة المشتركة بين كافة سلاسل العمليات. يتم إنشاؤه عند بدء تشغيل JVM. يتم استخدامه لتخزين بنية الفئة واسم الفئة الفائقة واسم الواجهة والمنشئات. يقوم JVM بتخزين الأنواع التالية من المعلومات في منطقة الطريقة:

  • اسم مؤهل بالكامل من النوع (على سبيل المثال: سلسلة)
  • معدّلات النوع
  • اسم الفئة الفائقة المباشر للنوع
  • قائمة منظمة بالأسماء المؤهلة بالكامل للواجهات الفائقة.

منطقة الكومة

الكومة تخزن الكائنات الفعلية. يتم إنشاؤه عند بدء تشغيل JVM. يمكن للمستخدم التحكم في الكومة إذا لزم الأمر. يمكن أن تكون ذات حجم ثابت أو ديناميكي. عند استخدام كلمة أساسية جديدة، يقوم JVM بإنشاء مثيل للكائن في الكومة. بينما يتم تخزين مرجع هذا الكائن في المكدس. توجد كومة واحدة فقط لكل عملية JVM قيد التشغيل. عندما تصبح الكومة ممتلئة، يتم جمع القمامة. على سبيل المثال:

 StringBuilder sb= new StringBuilder(); 

يقوم البيان أعلاه بإنشاء كائن من فئة StringBuilder. يتم تخصيص الكائن للكومة، ويخصص المرجع sb للمكدس. تنقسم الكومة إلى الأجزاء التالية:

  • جيل الشباب
  • مساحة الناجين
  • الجيل القديم
  • جيل دائم
  • ذاكرة التخزين المؤقت للكود

نوع مرجع

هناك أربعة أنواع من المراجع: قوي , ضعيف , ناعم ، و المرجع الوهمي . يتمثل الاختلاف بين أنواع المراجع في أن الكائنات الموجودة في الكومة التي تشير إليها مؤهلة لتجميع البيانات المهملة وفقًا لمعايير مختلفة.

مرجع قوي: الأمر بسيط جدًا حيث نستخدمه في برامجنا اليومية. أي كائن يحتوي على مرجع قوي مرفق به ليس مؤهلاً لجمع البيانات المهملة. يمكننا إنشاء مرجع قوي باستخدام العبارة التالية:

 StringBuilder sb= new StringBuilder(); 

مرجع ضعيف: ولا يبقى على قيد الحياة بعد عملية جمع القمامة التالية. إذا لم نكن متأكدين من موعد طلب البيانات مرة أخرى. وفي هذه الحالة يمكننا إنشاء مرجع ضعيف لها. في حالة قيام جامع البيانات المهملة بالمعالجة، فإنه يدمر الكائن. عندما نحاول مرة أخرى استرداد هذا الكائن، نحصل على قيمة فارغة. يتم تعريفه في java.lang.ref.WeakReference فصل. يمكننا إنشاء مرجع ضعيف باستخدام العبارة التالية:

 WeakReference reference = new WeakReference(new StringBuilder()); 

مرجع بسيط: يتم جمعها عندما تكون ذاكرة التطبيق منخفضة. لا يقوم جامع البيانات المهملة بتجميع الكائنات التي يمكن الوصول إليها بسهولة. يتم جمع كافة الكائنات المرجعية الناعمة قبل أن تقوم بإلقاء خطأ OutOfMemoryError. يمكننا إنشاء مرجع بسيط باستخدام العبارة التالية:

 SoftReference reference = new SoftReference(new StringBuilder()); 

المرجع الوهمي: وهي متوفرة في java.lang.ref طَرد. يتم تعريفه في java.lang.ref.PhantomReference فصل. يمكن جمع الكائن الذي يحتوي على مرجع وهمي فقط يشير إليه عندما يريد جامع البيانات المهملة جمعه. يمكننا إنشاء مرجع وهمي باستخدام العبارة التالية:

 PhantomReference reference = new PhantomReference(new StringBuilder()); 

منطقة المكدس

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

إطار المكدس: إطار المكدس عبارة عن بنية بيانات تحتوي على بيانات مؤشر الترابط. تمثل بيانات الخيط حالة الخيط في الطريقة الحالية.

  • يتم استخدامه لتخزين النتائج والبيانات الجزئية. كما أنه يقوم بتنفيذ الارتباط الديناميكي، وإرجاع القيم عن طريق الأساليب واستثناءات الإرسال.
  • عندما تستدعي إحدى الطرق، يتم إنشاء إطار جديد. إنه يدمر الإطار عند اكتمال استدعاء الطريقة.
  • يحتوي كل إطار على مصفوفة متغيرة محلية (LVA) ومكدس عامل (OS) وبيانات إطار (FD).
  • يتم تحديد أحجام LVA وOS وFD في وقت الترجمة.
  • إطار واحد فقط (إطار طريقة التنفيذ) نشط في أي نقطة في سلسلة تحكم معينة. يسمى هذا الإطار بالإطار الحالي، وتعرف طريقته بالطريقة الحالية. تسمى فئة الطريقة بالفئة الحالية.
  • يوقف الإطار الطريقة الحالية، إذا استدعت طريقتها طريقة أخرى أو إذا اكتملت الطريقة.
  • الإطار الذي تم إنشاؤه بواسطة مؤشر ترابط محلي لذلك الموضوع ولا يمكن الرجوع إليه بواسطة أي مؤشر ترابط آخر.

مكدس الطريقة الأصلية

ومن المعروف أيضًا باسم مكدس C. إنها عبارة عن مكدس للتعليمات البرمجية الأصلية المكتوبة بلغة أخرى غير Java. تستدعي واجهة Java الأصلية (JNI) المكدس الأصلي. يعتمد أداء المكدس الأصلي على نظام التشغيل.

سجلات الكمبيوتر

يحتوي كل مؤشر ترابط على سجل عداد البرامج (PC) المرتبط به. يقوم سجل الكمبيوتر بتخزين عنوان المرسل أو المؤشر الأصلي. ويحتوي أيضًا على عنوان تعليمات JVM التي يتم تنفيذها حاليًا.

عمل جامع القمامة

نظرة عامة على جامع القمامة

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

تخصيص الكائنات

عندما يتم تخصيص كائن، يتحقق JRockit JVM من حجم الكائن. فهو يميز بين الأشياء الصغيرة والكبيرة. يعتمد الحجم الصغير والكبير على إصدار JVM وحجم الكومة واستراتيجية جمع البيانات المهملة والنظام الأساسي المستخدم. يتراوح حجم الكائن عادة بين 2 إلى 128 كيلو بايت.

يتم تخزين الكائنات الصغيرة في منطقة مؤشر الترابط المحلية (TLA) وهي جزء مجاني من الكومة. لا يتزامن TLA مع سلاسل الرسائل الأخرى. عندما يصبح TLA ممتلئًا، فإنه يطلب TLA جديدًا.

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

ماذا يفعل جامع البيانات المهملة جافا؟

يتحكم JVM في أداة تجميع البيانات المهملة. يقرر JVM متى يتم تنفيذ عملية جمع البيانات المهملة. يمكننا أيضًا أن نطلب من JVM تشغيل أداة تجميع البيانات المهملة. ولكن لا يوجد ضمان تحت أي ظرف من الظروف بأن JVM سوف يمتثل. يقوم JVM بتشغيل أداة تجميع البيانات المهملة إذا شعر بأن الذاكرة منخفضة. عندما يطلب برنامج Java أداة تجميع البيانات المهملة، عادةً ما يمنح JVM الطلب في وقت قصير. ولا يتأكد من قبول الطلبات.

النقطة التي يجب أن نفهمها هي أن ' عندما يصبح الكائن مؤهلاً لجمع البيانات المهملة؟ '

يحتوي كل برنامج جافا على أكثر من موضوع واحد. كل موضوع لديه مكدس التنفيذ الخاص به. يوجد مؤشر ترابط للتشغيل في برنامج Java وهو طريقة main(). يمكننا الآن أن نقول أن الكائن مؤهل لجمع البيانات المهملة عندما لا يتمكن أي مؤشر ترابط مباشر من الوصول إليه. يعتبر جامع البيانات المهملة هذا الكائن مؤهلاً للحذف. إذا كان لدى البرنامج متغير مرجعي يشير إلى كائن، فإن هذا المتغير المرجعي متاح للخيط المباشر، يتم استدعاء هذا الكائن يمكن الوصول إليها .

رقم عشوائي في جافا

وهنا يطرح سؤال مفاده ' هل يمكن أن ينفد تطبيق Java من الذاكرة؟ '

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

أنواع جمع القمامة

هناك خمسة أنواع من جمع القمامة هي كما يلي:

    المسلسل جي سي:يستخدم نهج العلامة والاكتساح للأجيال الشابة والكبار، وهو GC الصغرى والكبرى.GC الموازية:إنه مشابه لـ GC التسلسلي باستثناء أنه يولد خيوط N (عدد نوى وحدة المعالجة المركزية في النظام) لجمع القمامة من الجيل الجديد.GC الموازي القديم:إنه مشابه لـ GC الموازي، إلا أنه يستخدم سلاسل رسائل متعددة لكلا الجيلين.أداة تجميع العلامات المتزامنة (CMS):يقوم بجمع القمامة للجيل القديم. يمكنك تحديد عدد المواضيع في مجمع CMS باستخدام XX:ParalleCMSThreads=خيار JVM . يُعرف أيضًا باسم مُجمع الإيقاف المؤقت المنخفض المتزامن.جامع القمامة G1:تم تقديمه في Java 7. وهدفه هو استبدال مجمع CMS. وهو جامع متوازي ومتزامن وCMS. لا توجد مساحة للأجيال الشابة والكبار. يقوم بتقسيم الكومة إلى عدة أكوام متساوية الحجم. يقوم أولاً بجمع المناطق ذات البيانات المباشرة الأقل.

خوارزمية مارك واكتساح

يستخدم JRockit JVM خوارزمية العلامة والمسح لتنفيذ عملية جمع البيانات المهملة. تحتوي على مرحلتين، مرحلة العلامة، ومرحلة المسح.

مرحلة العلامة: يتم وضع علامة على الكائنات التي يمكن الوصول إليها من خلال مؤشرات الترابط والمقابض الأصلية ومصادر جذر GC الأخرى على أنها حية. تحتوي كل شجرة كائن على أكثر من كائن جذر واحد. يمكن دائمًا الوصول إلى جذر GC. إذن أي كائن له جذر مجموعة البيانات المهملة في جذره. فهو يحدد كافة الكائنات المستخدمة ويضع علامة عليها، ويمكن اعتبار العناصر المتبقية غير مرغوب فيها.

إدارة الذاكرة في جافا

مرحلة الاجتياح: في هذه المرحلة، يتم اجتياز الكومة للعثور على الفجوة بين الكائنات الحية. يتم تسجيل هذه الفجوات في القائمة المجانية وتكون متاحة لتخصيص الكائنات الجديدة.

هناك نسختان محسنتان من Mark and Swee:

    العلامة المتزامنة والاجتياح علامة موازية واكتساح

العلامة المتزامنة والاجتياح

يسمح للخيوط بمواصلة التشغيل أثناء جزء كبير من مجموعة البيانات المهملة. هناك الأنواع التالية من العلامات:

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

علامة موازية واكتساح

يستخدم كل وحدة المعالجة المركزية المتوفرة في النظام لإجراء عملية جمع البيانات المهملة في أسرع وقت ممكن. ويسمى أيضًا جامع البيانات المهملة الموازي. لا يتم تنفيذ مؤشرات الترابط عند تنفيذ مجموعة البيانات المهملة المتوازية.

إيجابيات مارك آند سويب

  • إنها عملية متكررة.
  • إنها حلقة لا نهاية لها.
  • لا يُسمح بأي نفقات إضافية أثناء تنفيذ الخوارزمية.

سلبيات مارك آند سويب

  • فهو يوقف تنفيذ البرنامج العادي أثناء تشغيل خوارزمية جمع البيانات المهملة.
  • يتم تشغيله عدة مرات على البرنامج.