خوارزميات GC: Serial وG1 وZGC وShenandoah
قارن خصائص فترات توقف GC ومفاضلات الإنتاجية بين جامعات JVM الحديثة
خوارزميات GC: Serial وG1 وZGC وShenandoah درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
اختيار خوارزمية GC
تأتي JVM مع عدة خوارزميات لجمع القمامة، وقد حُسّنت كل واحدة منها لأحمال عمل مختلفة. ويعتمد اختيار الخوارزمية المناسبة على حجم الكومة، ومتطلبات زمن الاستجابة، وأهداف الإنتاجية.
// Enable GC algorithms:
// -XX:+UseSerialGC
// -XX:+UseParallelGC
// -XX:+UseG1GC (default since Java 9)
// -XX:+UseZGC (Java 15+ production)
// -XX:+UseShenandoahGC (Red Hat / OpenJDK builds)Serial GC
تستخدم Serial GC خيطًا واحدًا للجمع. وتتوقف جميع خيوط التطبيق أثناء GC، فيما يُعرف باسم stop-the-world. ولا تناسب إلا الأكوام الصغيرة أو البيئات ذات وحدة معالجة واحدة، مثل الأنظمة المضمنة.
// Use:
// java -XX:+UseSerialGC -Xmx256m MyApp
// Pauses: long (proportional to heap size)
// Throughput: low
// Best for: CLI tools, small heaps < 100 MBParallel GC (جامع الإنتاجية)
تستخدم Parallel GC عدة خيوط لعمليات Minor GC وMajor GC. وتكون توقفات stop-the-world أقصر من Serial، لكنها تظل ملحوظة. وهي مناسبة لمعالجة الدُفعات حيث تكون الإنتاجية أهم من زمن الاستجابة.
// Use:
// java -XX:+UseParallelGC -XX:ParallelGCThreads=8 MyApp
// Pauses: moderate
// Throughput: high
// Best for: batch jobs, number crunchingG1 GC (Garbage-First)
تقسم G1 الكومة إلى مناطق متساوية الحجم (~2 KB – 32 MB). وتجمع أولًا المناطق التي تحتوي على أكبر قدر من القمامة، مع الالتزام بهدف توقف قابل للضبط. وهي الافتراضية منذ Java 9.
// Use:
// java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 MyApp
// Pauses: bounded by target (but not guaranteed)
// Throughput: good
// Best for: large heaps (4 GB+), mixed workloadsأنواع مناطق G1
تُسند مناطق G1 ديناميكيًا بوصفها Eden أو Survivor أو Old أو Humongous، للكائنات الكبيرة التي يتجاوز حجمها 50% من حجم المنطقة. وتتيح هذه المرونة إجراء الجمع تدريجيًا.
ZGC (جامع القمامة Z)
تنفّذ ZGC معظم عملها بالتزامن مع التطبيق. وتكون أوقات التوقف عادةً أقل من 1 ms بغض النظر عن حجم الكومة. وأصبحت جاهزة للاستخدام في الإنتاج منذ Java 15.
// Use:
// java -XX:+UseZGC -Xmx16g MyApp
// Pauses: < 1 ms (usually)
// Throughput: slightly lower than G1 (concurrent work has CPU cost)
// Best for: large heaps, low-latency services (APIs, trading)Shenandoah GC
تحقق Shenandoah، من Red Hat، أيضًا توقفات أقل من ميلي ثانية من خلال الضغط المتزامن. وهي متاحة في إصدارات OpenJDK. وتهدف إلى أهداف مشابهة جدًا لأهداف ZGC، لكنها تستخدم خوارزميات داخلية مختلفة.
// Use:
// java -XX:+UseShenandoahGC MyApp
// Available in: Red Hat builds, some AdoptOpenJDK distributions
// Pauses: sub-millisecond
// Best for: latency-sensitive workloadsGenerational ZGC (Java 21+)
قدمت Java 21 Generational ZGC، التي تجمع بين نهج ZGC منخفض التوقف والجمع التوليدي، مما يقلل الحمل على وحدة المعالجة المركزية مع الحفاظ على توقفات قصيرة.
// Enable in Java 21+:
// java -XX:+UseZGC -XX:+ZGenerational -Xmx8g MyAppالمفاضلة بين وقت توقف GC والإنتاجية
لا توجد خوارزمية GC هي الأفضل في كل شيء. تحقق Parallel GC أقصى إنتاجية. وتوازن G1 بين الإنتاجية وزمن الاستجابة. بينما تقلل ZGC وShenandoah التوقفات إلى أدنى حد مع تكلفة بسيطة في الإنتاجية.
تفعيل تسجيل GC
سجّلوا أحداث GC باستخدام -Xlog:gc*:file=gc.log:time,uptime,level. وحللوا السجلات باستخدام أدوات مثل GCViewer أو GCEasy للعثور على التوقفات الطويلة وارتفاعات التخصيص.
// JVM flags:
// -Xlog:gc*:file=gc.log:time,uptime,level,tags
// Inspect logs:
// cat gc.log | grep "Pause"مراقبة GC باستخدام مقاييس JVM
استخدموا ManagementFactory.getGarbageCollectorMXBeans() لقراءة عدد عمليات GC ووقتها برمجيًا، أو صدّروها إلى Prometheus عبر Micrometer في تطبيقات Spring Boot.
ManagementFactory.getGarbageCollectorMXBeans().forEach(gc ->
System.out.printf("%s: %d collections, %d ms%n",
gc.getName(), gc.getCollectionCount(), gc.getCollectionTime()));تحقق سريع
أي خوارزمية GC تستهدف أوقات توقف أقل من ميلي ثانية في بيئة الإنتاج؟
مراجعة
استخدموا Serial GC للأكوام الصغيرة جدًا، وParallel GC لإنتاجية معالجة الدُفعات، وG1 لأحمال العمل المتوازنة، فهي الافتراضية، وZGC أو Shenandoah لزمن الاستجابة المنخفض جدًا. فعّلوا تسجيل GC في بيئة الإنتاج لاكتشاف المشكلات مبكرًا.
تعلم Java مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 104
- الدروس
- 374
الأسئلة الشائعة
هل درس «خوارزميات GC: Serial وG1 وZGC وShenandoah» مجاني؟
نعم — نص درس «خوارزميات GC: Serial وG1 وZGC وShenandoah» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «خوارزميات GC: Serial وG1 وZGC وShenandoah»؟
قارن خصائص فترات توقف GC ومفاضلات الإنتاجية بين جامعات JVM الحديثة تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «خوارزميات GC: Serial وG1 وZGC وShenandoah»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مناطق ذاكرة JVM ودورة حياة الكائنات
- خوارزميات GC: Serial وG1 وZGC وShenandoah
- اكتشاف تسرّبات الذاكرة وإصلاحها
- أعلام ضبط GC وتحليل JVisualVM