ما هو Garbage Collection

في أي برنامج، لما تعمل (object) جديد، بيُخزَّن في الذاكرة (Heap).
ولما تخلص منه (يعني ما يكونش عليه أي Reference)، لازم يتم حذفُه من الذاكرة عشان ما يحصلش Memory Leak.

🔹 في لغات زي C أو C++، المطور هو اللي بيعمل ده يدويًا (بـ free() أو delete)
🔹 لكن في Java، الـ Garbage Collector (GC) هو اللي بيعمل ده تلقائيًا 👇

🧠 فكر فيها كأنك عندك عامل نظافة في الذاكرة —
كل شوية يراجع الكائنات ويشيل اللي محدش بيستخدمه.

⚙️ كيف يعمل الـ Garbage Collector

كل Object بيتخزّن في منطقة اسمها Heap Memory،
والـ GC بيشتغل كده:

  1. يبدأ من الـ Root Objects
    زي المتغيرات اللي لسه في الـ stack (المتغيرات المحلية اللي بتشير إلى كائنات).
  2. يتتبع كل الكائنات المرتبطة بيها (Reachable Objects)
    يعني الكائنات اللي لسه في قيد الاستخدام.
  3. أي كائن مافيش أي Reference عليه → بيعتبره Garbage.
  4. الـ 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

  1. ✅ أعد استخدام الكائنات بدل إنشاء الجديد في كل مرة.
  2. ✅ تجنب الكائنات المؤقتة الكثيرة داخل loops.
  3. ✅ استخدم الـ StringBuilder بدل الـ String + concatenation.
  4. ✅ راقب الذاكرة باستمرار (Memory Profiling).
  5. ✅ استخدم GC المناسب حسب نوع التطبيق (Web, Batch, Low-latency).

❤️ باختصار:

Garbage Collection = نظام إدارة الذاكرة الذكي في Java
بيخلّيها:أكثر أمانًا (مفيش memory leak أو segmentation fault)أسهل في التطويروأكتر استقرارًا في المشاريع الكبيرة

Read more

لماذا يجب على كل Backend Engineer فهم 12-Factor App؟

في عالم البرمجة، أغلب المطورين يقضون وقتًا كبيرًا في كتابة الكود، لكن المشاكل الحقيقية غالبًا لا تظهر أثناء التطوير… بل تظهر بعد النشر في بيئة الإنتاج (Production). مشاكل مثل: * التطبيق شغال عندك ومش شغال على السيرفر * إعدادات مختلفة بين dev و prod * صعوبة في التوسّع (scaling)

By mahmoud hassan

ليه الناس بتستخدم الجافا

☕ أولًا: ما الذي يميّز جافا عن لغات البرمجة الأخرى؟ 🧱 1. الاستقرار والاعتمادية (Stability) * جافا معمولة للمؤسسات الكبيرة (Enterprise Systems) — زي البنوك، شركات الاتصالات، والحكومات. * الشركات دي بتحب استقرار الكود أكتر من أي شيء تاني. * أنظمة بتشتغل 10 و15 سنة على نفس الكود بدون مشاكل. 🎯 عشان كده معظم: * أنظمة

By mahmoud hassan

ايه هو ال spring batch واهم مميزاته

Spring Batch من الأدوات اللي بتبان “متخصصة” لكنها مهمة جدًا في عالم المؤسسات والبنوك والأنظمة الكبيرة اللي بتتعامل مع كميات ضخمة من البيانات. خلينا نبدأ من الأساس ونمشي خطوة بخطوة 👇 ⚙️ ما هو Spring Batch؟ Spring Batch هو إطار عمل (Framework) من Spring مصمم لمعالجة البيانات الدفعيّة (Batch Processing)

By mahmoud hassan