ما هو Garbage Collection
في أي برنامج، لما تعمل (object) جديد، بيُخزَّن في الذاكرة (Heap).
ولما تخلص منه (يعني ما يكونش عليه أي Reference)، لازم يتم حذفُه من الذاكرة عشان ما يحصلش Memory Leak.
🔹 في لغات زي C أو C++، المطور هو اللي بيعمل ده يدويًا (بـ free() أو delete)
🔹 لكن في Java، الـ Garbage Collector (GC) هو اللي بيعمل ده تلقائيًا 👇
🧠 فكر فيها كأنك عندك عامل نظافة في الذاكرة —
كل شوية يراجع الكائنات ويشيل اللي محدش بيستخدمه.
⚙️ كيف يعمل الـ Garbage Collector
كل Object بيتخزّن في منطقة اسمها Heap Memory،
والـ GC بيشتغل كده:
- يبدأ من الـ Root Objects
زي المتغيرات اللي لسه في الـ stack (المتغيرات المحلية اللي بتشير إلى كائنات). - يتتبع كل الكائنات المرتبطة بيها (Reachable Objects)
يعني الكائنات اللي لسه في قيد الاستخدام. - أي كائن مافيش أي Reference عليه → بيعتبره Garbage.
- الـ GC يحذفه ويحرّر المساحة اللي كان واخدها.
🧩 أنواع Garbage Collectors في Java (من JDK 8 لحد الآن)
| الاسم | المميزات | الاستخدام النموذجي |
|---|---|---|
| Serial GC | بسيط وأحادي الـ Thread | مناسب لتطبيقات صغيرة أو single-threaded |
| Parallel GC | بيستخدم أكثر من Thread للتجميع | الافتراضي في Java 8 – مناسب للسيرفرات |
| CMS (Concurrent Mark-Sweep) | بيجمع القمامة بالتوازي مع تشغيل البرنامج | تقليل التوقفات الطويلة (deprecated الآن) |
| G1 GC (Garbage First) | ذكي جدًا، بيقسّم الذاكرة لمناطق صغيرة | الافتراضي من Java 9 – مناسب للتطبيقات الكبيرة |
| ZGC / Shenandoah GC | شبه لحظي (Pause Time < 10ms) | لتطبيقات الـ Cloud و الـ Low-latency systems |
🧠 كيف يُقسَّم الـ Heap في JVM
Heap Memory مقسومة لمناطق تساعد الـ GC يشتغل بكفاءة:
Heap
├── Young Generation
│ ├── Eden (كائنات جديدة) │ ├── Survivor 0
│ └── Survivor 1
└── Old Generation (كائنات طويلة العمر)
- الكائن الجديد بيتحط في Eden
- لو عاش أكتر من دورة GC → بيتنقل للـ Survivor
- لو عاش أكتر من كده → بيروح للـ Old Generation
🔹 ده بيخلي GC يركز أكتر على حذف الكائنات “الحديثة” اللي بتنتهي بسرعة.
🔥 أنواع الـ GC Cycles
| النوع | المعنى |
|---|---|
| Minor GC | بيحذف الكائنات الميتة من الـ Young Generation |
| Major / Full GC | بيحذف من الـ Old Generation كمان — بياخد وقت أطول |
📊 تقدر تراقب الـ GC أثناء التشغيل
1. من سطر الأوامر:
java -XX:+PrintGCDetails -jar app.jar
هيطبع كل مرة بيحصل فيها GC، وحجم الذاكرة قبل وبعد.
2. من أدوات مثل:
- JVisualVM (بييجي مع JDK)
- JConsole
- Java Mission Control
💡 نصائح لتقليل ضغط Garbage Collection
- ✅ أعد استخدام الكائنات بدل إنشاء الجديد في كل مرة.
- ✅ تجنب الكائنات المؤقتة الكثيرة داخل loops.
- ✅ استخدم الـ StringBuilder بدل الـ String + concatenation.
- ✅ راقب الذاكرة باستمرار (Memory Profiling).
- ✅ استخدم GC المناسب حسب نوع التطبيق (Web, Batch, Low-latency).
❤️ باختصار:
Garbage Collection = نظام إدارة الذاكرة الذكي في Java
بيخلّيها:أكثر أمانًا (مفيش memory leak أو segmentation fault)أسهل في التطويروأكتر استقرارًا في المشاريع الكبيرة