عند التحضير لمقابلات مطوري Java، يمكن أن يكون فهم كيفية تنظيم الذاكرة داخل Java Virtual Machine (JVM) موضوعًا رئيسيًا للمناقشة. سيسلط هذا المنشور الضوء على مناطق الذاكرة المختلفة في JVM - على وجه التحديد Stack و Heap و MetaSpace - مما يوفر النقاط الأساسية التي قد يركز عليها القائمون على المقابلات. من خلال التعرف على هذه المفاهيم، يمكنك تحسين استعدادك للمقابلة وإظهار فهمك لإدارة ذاكرة Java.
أدوار JDK وJRE وJVM
قبل الغوص مباشرة في مساحات ذاكرة JVM، دعنا نستكشف بسرعة الاتصال بين Java Development Kit (JDK)، Java Runtime Environment (JRE)، وJava الجهاز الظاهري (JVM)، وحدد المكان الذي يناسبه JVM بالضبط ضمن هذا الإطار.
Stack وHeap وMetaSpace
، لمعرفة كيفية تنظيم الذاكرة أثناء تنفيذ تطبيقات Java.
1. كومة الذاكرة
ما يتم تخزينه في ذاكرة المكدس:
- استدعاءات الطريقة: في كل مرة يتم فيها استدعاء طريقة، يتم دفع إطار جديد إلى المكدس، والذي يتضمن:
- معلمات الطريقة: الوسائط التي تم تمريرها إلى الطريقة.
- المتغيرات المحلية: المتغيرات المعلنة داخل الطريقة. وهذا يشمل:
- أنواع البيانات الأولية: يتم تخزين القيم الفعلية للمتغيرات المحلية المعلنة كأنواع بدائية مباشرة في المكدس.
- المراجع إلى الكائنات: بالنسبة للمتغيرات المحلية التي تنتمي إلى أنواع الكائنات، يتم تخزين المراجع إلى الكائنات الفعلية فقط (الموجودة في ذاكرة الكومة) في المكدس.
- عنوان الإرجاع: العنوان الذي سيتم الرجوع إليه بعد اكتمال تنفيذ الطريقة.
معلومات إضافية حول ذاكرة المكدس:
- تخصيص الذاكرة وإلغاء تخصيصها: يتم تخصيص ذاكرة الطريقة عند استدعاء الطريقة وإلغاء تخصيصها عند انتهاء التنفيذ.
- سلامة الموضوع: كل موضوع في Java لديه ذاكرة مكدسة خاصة به، مما يضمن أن المتغيرات المحلية آمنة لسلسلة الرسائل.
- حجم محدود: ذاكرة المكدس محدودة الحجم بشكل عام، مما قد يؤدي إلى أخطاء تجاوز سعة المكدس إذا تم إجراء عدد كبير جدًا من استدعاءات الأساليب (على سبيل المثال، في حالة التكرار العميق).
2. كومة الذاكرة
ما يتم تخزينه في ذاكرة الكومة:
- الكائنات: يتم تخزين الكائنات فقط في ذاكرة الكومة. وهذا يشمل:
- كائنات الفئة المعرفة من قبل المستخدم : المثيلات التي تم إنشاؤها من فئات محددة من قبل المستخدم.
- كائنات الفئة المضمنة : مثيلات فئات Java المضمنة، بما في ذلك المصفوفات وفئات التجميع مثل ArrayList وHashMap وما إلى ذلك.
- متغيرات المثيل: باعتبارها حقولًا غير ثابتة تنتمي إلى كائن، يتم تخزين متغيرات المثيل مع الكائن في الكومة.
- تجمع السلسلة : منطقة خاصة في الكومة تخزن سلسلة حرفية. إذا تم إنشاء سلسلة حرفية، تقوم Java بفحص تجمع السلسلة أولاً؛ إذا كان موجودًا، فسيتم إرجاع المرجع إلى الكائن الموجود بدلاً من إنشاء كائن جديد.
معلومات إضافية حول ذاكرة الكومة:
- تخصيص الذاكرة: يتم تخصيص الذاكرة عند إنشاء كائن وإلغاء تخصيصه بواسطة أداة تجميع البيانات المهملة عندما لا يكون من الممكن الوصول إلى الكائن.
- مجموعة البيانات المهملة : يقوم جامع البيانات المهملة تلقائيًا بإدارة الذاكرة في الكومة عن طريق تحديد وإزالة الكائنات التي لم يعد من الممكن الوصول إليها أو الحاجة إليها.
- الذاكرة المشتركة : تتم مشاركة ذاكرة الكومة بين جميع سلاسل العمليات، مما يسمح بالاتصال بين الخيوط . يمكن الوصول إلى الكائنات التي تم إنشاؤها بواسطة مؤشر ترابط واحد أو تعديلها أو الرجوع إليها بواسطة سلاسل رسائل أخرى. وهذا يستلزم استخدام تقنيات تعدد العمليات لإدارة الوصول إلى الكائنات المشتركة، وضمان اتساق البيانات وتجنب حالات السباق.
3. منطقة الطريقة / ميتا سبيس
تُعرف منطقة الطريقة أيضًا باسم MetaSpace في Java 8 والإصدارات الأحدث.
ما يتم تخزينه في منطقة الطريقة / MetaSpace:
- البيانات التعريفية للفصل : يتم تخزين المعلومات حول الفئات، مثل بنيتها (الحقول والأساليب والواجهات) والعلاقات مع الفئات الأخرى، في MetaSpace.
- المتغيرات الثابتة: يتم تخزين الحقول الثابتة المعلنة في الفئات في MetaSpace، مما يجعلها في متناول جميع مثيلات تلك الفئة.
- تجمع ثابت لوقت التشغيل : يحتوي هذا التجمع على القيم الحرفية والمراجع المستخدمة أثناء وقت التشغيل. بالنسبة للسلاسل الحرفية، يتم تخزين المراجع هنا (يتم تخزين القيم الفعلية في String Pool في الكومة)، بينما يتم تخزين القيم الحرفية الأخرى (مثل الرقمية والمنطقية) مباشرة كقيم.
معلومات إضافية حول منطقة الطريقة / MetaSpace:
- الذاكرة المشتركة : تتم مشاركة منطقة الطريقة بين جميع سلاسل الرسائل، مما يعني وجود مثيل MetaSpace واحد فقط داخل JVM. وهذا يسمح بالإدارة الفعالة لمعلومات الفصل ويقلل من حمل الذاكرة.
- المزامنة : يعالج JVM المزامنة عند الوصول إلى منطقة الطريقة لمنع التناقضات وضمان سلامة الخيط.
خاتمة
يعد فهم مجالات الذاكرة الثلاثة هذه أمرًا بالغ الأهمية لأي مطور Java. إنها تشكل الأساس لمفاهيم مهمة مثل
جمع البيانات المهملة
، تسربات الذاكرة، وسلامة سلسلة المحادثات، والتي سيتم مناقشتها في المقالات القادمة في هذه السلسلة.
المشاركات ذات الصلة
أساسيات جافا
أساسيات مقابلة المصفوفة
تعليمات سعيدة!