الذاكرة وجامع القمامة في Java: ما يحدث حقًا تحت الغطاء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كيف تدير Java الذاكرة: ليس مجرد "جمع القمامة"

\n\n

كثير من المطورين الذين ينتقلون إلى Java من C++ أو Python يفرحون في البداية: "رائع، لا داعي للقلق بشأن تسرب الذاكرة!". ثم يتلقون خطأ OutOfMemoryError في أكثر الأوقات غير المناسبة ويدركون أن إدارة الذاكرة في Java تتطلب فهمًا عميقًا. اليوم سنلقي نظرة تحت غطاء JVM ونتعرف على كيفية عمل الذاكرة وجامع القمامة في Java بالفعل.

\n\n

هذا المقال سيكون مفيدًا لكل من المبتدئين الذين يرغبون في فهم نموذج الذاكرة Java، والمطورين ذوي الخبرة الذين يبحثون عن طرق لتحسين garbage collection Java. هيا بنا!

\n\n
\n\n

كيف يتم تنظيم الذاكرة في Java: الكومة، المكدس، و Metaspace

\n\n

قبل الحديث عن جامع القمامة Java، يجب أن نفهم أين "تعيش" كائناتك بالضبط. تقوم JVM بتقسيم الذاكرة إلى عدة مناطق رئيسية:

\n\n
    \n
  • Heap (الكومة) — هنا يتم تخزين جميع الكائنات التي يتم إنشاؤها. هذا هو مجال العمل الرئيسي لـ garbage collection Java.
  • \n
  • Stack (المكدس) — يخزن الأنواع البدائية والمراجع إلى الكائنات في الكومة. كل خيط له مكدسه الخاص.
  • \n
  • Metaspace — حل محل PermGen في Java 8، ويخزن بيانات تعريف الفئات.
  • \n
  • Code Cache — الكود الذي تم تجميعه بواسطة المترجم JIT.
  • \n
\n\n

إليك مثال بسيط يوضح أين تذهب البيانات:

\n\n
public class MemoryDemo {\n    public static void main(String[] args) {\n        int number = 42;                    // بدائي — في المكدس\n        String text = "Hello";              // مرجع في المكدس، الكائن في الكومة\n        List<String> list = new ArrayList<>(); // مرجع في المكدس، القائمة في الكومة\n        list.add("Java");                   // السلسلة "Java" — أيضًا في الكومة\n    }\n}\n
\n\n

النقطة الأساسية: جميع الكائنات التي تم إنشاؤها عبر new تذهب إلى heap Java. هذه هي المنطقة التي "يراقبها" جامع القمامة في Java.

\n\n
\n\n

لماذا جامع القمامة ليس عدوًا بل صديق (إذا فهمت منطقه)

\n\n

كثير من المطورين يخافون من Java GC بسبب توقفات "Stop-The-World". لكن دعونا نواجه الحقيقة: بدون إدارة الذاكرة التلقائية في Java، كنا سنكتب free() يدويًا ونواجه أخطاء segfault. جامع القمامة Java ليس شيطانًا شريرًا، بل آلية معقدة وذكية.

\n\n

المبادئ الأساسية لعمل garbage collection Java:

\n\n
    \n
  • يعتبر الكائن "قمامة" إذا لم تكن هناك مراجع نشطة إليه من المكدس أو الحقول الثابتة.
  • \n
  • لا يمكن لـ GC حذف كائن لا يزال هناك مرجع إليه (حتى لو نسيت أمره).
  • \n
  • الخوارزميات المختلفة لـ GC لها أهداف مختلفة: أقل توقفات، أقصى إنتاجية، أو توفير في الذاكرة.
  • \n
\n\n

إليك مثال كلاسيكي على تسرب الذاكرة، عندما يتم "نسيان" إزالة كائن من مجموعة:

\n\n
public class LeakExample {\n    private static List<byte[]> cache = new ArrayList<>();\n\n    public static void addToCache() {\n        byte[] data = new byte[1024 * 1024]; // 1 MB\n        cache.add(data); // يبقى المرجع — لن يلمسه GC\n    }\n\n    public static void main(String[] args) {\n        for (int i = 0; i < 1000; i++) {\n            addToCache();\n        }\n        // هنا سيحدث OutOfMemoryError، على الرغم من أن الكائنات لم تعد مطلوبة\n    }\n}\n
\n\n

الخلاصة: الذاكرة في Java لن تتحرر طالما أنك تحتفظ بالمرجع. فهم هذا هو الخطوة الأولى لكتابة كود فعال.

\n\n
\n\n

أنواع جامعي القمامة في Java: من Serial إلى ZGC

\n\n

تقدم Java الحديثة عدة تطبيقات لـ garbage collection Java. يعتمد الاختيار على مهامك:

\n\n

1. Serial GC — للتطبيقات الصغيرة

\n

جامع أحادي الخيط "يجمد" التطبيق بأكمله. يُستخدم بشكل

المدونات

توصيات الكتب