0Pricing
Java Academy · درس

مناطق ذاكرة JVM ودورة حياة الكائنات

استكشف الجيل الفتي (Eden وSurvivor) والجيل القديم وMetaspace، وكيف تنتقل الكائنات بينها

مناطق ذاكرة JVM ودورة حياة الكائنات درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

نموذج ذاكرة JVM

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

الجيل الفتي: مساحة Eden

تذهب الكائنات المخصّصة حديثًا إلى Eden. وعندما تمتلئ Eden، تُجرى عملية Minor GC. وتُنقل الكائنات الناجية إلى مساحة Survivor.

// Object allocation starts in Eden:
String s = new String("hello");  // allocated in Eden
List<Integer> list = new ArrayList<>();  // also Eden

مساحتا Survivor: S0 وS1

تحتفظ مساحتا Survivor ‏(S0 وS1) بالكائنات التي نجت من عملية GC واحدة على الأقل. وتتبادل الكائنات الانتقال بين S0 وS1 عند كل عملية Minor GC، ويزداد عدّاد عمرها.

عتبة التعمير

عندما يتجاوز عمر كائن عتبة التعمير، وقيمتها الافتراضية 15، يُرقّى إلى الجيل القديم. وقد تتجاوز الكائنات الكبيرة الجيل الفتي وتنتقل مباشرةً إلى الجيل القديم.

// JVM flags:
// -XX:MaxTenuringThreshold=15  (default)
// -XX:PretenureSizeThreshold=1m  (objects > 1MB go directly to Old Gen)

الجيل القديم (المساحة المعمّرة)

تستقر الكائنات طويلة العمر في الجيل القديم. تجمع عمليات Major GC، أو Full GC، الجيل القديم وتكون أكثر تكلفة. ويؤدي تقليل عدد الكائنات طويلة العمر إلى خفض تكرار عمليات Full GC.

Metaspace ‏(Java 8+)

حلّت Metaspace محل PermGen في Java 8. وهي تحتوي على البيانات الوصفية للفئات، والرمز الثانوي للطرق، والسلاسل النصية المدخلة في pool. وتستخدم الذاكرة الأصلية وتنمو ديناميكيًا، مع إمكانية تقييدها باستخدام -XX:MaxMetaspaceSize.

// Flag examples:
// -XX:MetaspaceSize=64m        (initial Metaspace size)
// -XX:MaxMetaspaceSize=256m   (cap to avoid native OOM)

مسار التخصيص السريع للكائنات

تستخدم JVM مخازن التخصيص المحلية للخيوط (TLABs) للتخصيص من Eden دون مزامنة. ويمتلك كل خيط جزءًا صغيرًا خاصًا به من Eden.

دورة حياة الكائن: قابلية الوصول

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

Object a = new Object(); // reachable via local variable
a = null;                 // now unreachable — eligible for GC

المراجع Soft وWeak وPhantom

يُزال SoftReference قبل حدوث OOM، ويُستخدم عادةً لذاكرات التخزين المؤقت. ويُزال WeakReference عند عملية GC التالية. أما PhantomReference فيُستخدم للتنظيف بعد انتهاء عمر الكائن.

Cache<String, Image> cache = new LinkedHashMap<>();
// Use SoftReference to let GC reclaim cache under memory pressure:
SoftReference<Image> ref = new SoftReference<>(loadHeavyImage());
Image img = ref.get(); // null if GC collected it

إنهاء الكائنات (تجنبوه)

إن finalize() مهملة وغير حتمية؛ إذ تستدعيها GC قبل جمع الكائن، لكن توقيت الاستدعاء غير مضمون. استخدموا Cleaner، المتاح منذ Java 9، أو try-with-resources بدلًا منها.

أعلام ضبط حجم الكومة

تحكموا في حجم الكومة باستخدام -Xms للحجم الابتدائي و-Xmx للحجم الأقصى. اضبطوهما على القيمة نفسها في بيئة الإنتاج لتجنب توقفات تغيير حجم الكومة.

// Recommended production flags:
// -Xms512m -Xmx512m   (fix heap to 512 MB)
// -XX:NewRatio=2       (Old:Young = 2:1)

تحقق سريع

أين يستقر الكائن المخصّص حديثًا أولًا في كومة JVM؟

مراجعة

تحتوي كومة JVM على الجيل الفتي، الذي يضم Eden ومساحات Survivor، وعلى الجيل القديم. تتقدم الكائنات في العمر عبر عمليات Minor GC ثم تُرقّى. وتحتوي Metaspace على البيانات الوصفية للفئات. ويمكن التحكم في ذلك باستخدام -Xms/-Xmx وأعلام الضبط.

الأسئلة الشائعة

هل درس «مناطق ذاكرة JVM ودورة حياة الكائنات» مجاني؟

نعم — نص درس «مناطق ذاكرة JVM ودورة حياة الكائنات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «مناطق ذاكرة JVM ودورة حياة الكائنات»؟

استكشف الجيل الفتي (Eden وSurvivor) والجيل القديم وMetaspace، وكيف تنتقل الكائنات بينها تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «مناطق ذاكرة JVM ودورة حياة الكائنات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مناطق ذاكرة JVM ودورة حياة الكائنات
  2. خوارزميات GC: ‏Serial وG1 وZGC وShenandoah
  3. اكتشاف تسرّبات الذاكرة وإصلاحها
  4. أعلام ضبط GC وتحليل JVisualVM
← العودة إلى Java Academy