لتكوين معلمات JVM لتقليل توقف جمع القمامة (GC) ، من المهم فهم العمليات الأساسية لمجموعات القمامة المختلفة وآليات التوليف المتاحة في JVM. تتضمن عملية التكوين اختيار خوارزمية تجميع القمامة المناسبة ، وأحجام تكوين كومة التوليف ، وتكوين أهداف وقت الإيقاف المؤقت ، ومعلمات الخيوط ، وتحسين مناطق الذاكرة. فيما يلي توليفة مفصلة لضبط JVM لتقليل الإيقاف المؤقتة على GC بناءً على مصادر موثوقة وأفضل الممارسات:
اختيار جامع القمامة المناسب
يوفر JVM خوارزميات تجميع القمامة المتعددة ، ولكل منها خصائص مختلفة فيما يتعلق بالإنتاجية وأوقات الإيقاف المؤقت واستخدام الموارد:
- GC التسلسلي: يستخدم مؤشر ترابط واحد ل GC. إنه يوقف جميع مؤشرات ترابط التطبيق أثناء التجميع ، مما يؤدي إلى توقف مؤقت طويل. عمومًا غير مناسب لتقليل توقف مؤقت في التطبيقات الأكبر.
- GC المتوازي: يستخدم مؤشرات ترابط متعددة لأداء جمع القمامة ، وتقليل أوقات الإيقاف المؤقت مقارنة مع GC التسلسلي عن طريق الاستفادة من مراكز وحدة المعالجة المركزية المتعددة. إنه موجه نحو الإنتاجية ولكنه لا يزال يتوقف عن مؤشرات ترابط التطبيق خلال GC.
- Mark-Sweep (CMS) GC: يؤدي الكثير من أعمال جمع القمامة بشكل متزامن مع التطبيق ، مما يقلل بشكل كبير من أوقات الإيقاف المؤقت عن طريق التوقف لفترة وجيزة فقط للتطبيق في مراحل GC محددة. إنها مناسبة للتطبيقات منخفضة الانتشار.
- Garbage First (G1) GC: يقسم الكومة إلى المناطق ويركز على جمع المناطق بأكبر قدر من القمامة أولاً. يهدف إلى توفير أوقات توقف مؤقت يمكن التنبؤ بها وإنتاجية جيدة عن طريق خلط مراحل متزامنة ومتوازية. غالبًا ما يكون الافتراضي في إصدارات JVM الحديثة.
- Shenandoah و ZGC: يقوم هؤلاء جامعو الإنقاذ المنخفضة بأداء جميع أو معظم أعمال GC بشكل متزامن ، وتهدف إلى توقف مؤقت للغاية أو غير محسوس تقريبًا ، ومناسبة للأكوام الكبيرة والتطبيقات التي تستجيب للغاية.
يعتمد اختيار المجمع الصحيح على متطلبات التطبيق مثل الحد الأقصى لوقت الإيقاف المؤقت وحجم الكومة وخصائص عبء العمل.
تكوين حجم الكومة
حجم الكومة له تأثير مباشر على تواتر GC وفترات توقف مؤقت:
-قم بتعيين حجم الكومة الأولي والحد الأقصى متساوٍ: باستخدام "-xms` و` -xmx` مع نفس القيمة يتجنب تغيير حجم الكومة ، والذي يمكن أن يؤدي إلى توقف مؤقت أثناء وقت التشغيل.
- حجم الكومة الكافي: الكومة غير المخصصة تسبب مجموعات متكررة ، وزيادة توقف مؤقت. ومع ذلك ، يؤدي الإفراط في التخصيص إلى دورات GC أطول. ابحث عن توازن بناءً على احتياجات ذاكرة التطبيق.
- مراقبة سجلات GC ومقاييس استخدام الكومة لضبط حجم الكومة بشكل مناسب.
السيطرة على وقت الإيقاف المؤقت GC
يوفر JVM معلمات لوضع أهداف لأوقات توقف GC القصوى:
- `-xx: maxgcpausemillis =`: يحدد وقتًا أقصى وقت للتوقف مؤقتًا بالمللي ثانية حتى يحاول المجمع أن يجتمع. على الرغم من عدم ضمانه ، يحاول JVM ضبط الإنتاجية وعمل GC لتجنب تجاوز هذا الوقت الموقف.
- استخدم هذه المعلمة مع G1 GC أو جامعي الآخرين الذين يدعمون أهداف الوقت الموقوف لتوجيه JVM في موازنة الإنتاجية والكمون.
الخيوط والتوازي
الاستفادة من خيوط متعددة أثناء جمع القمامة يقلل من فترات الإيقاف المؤقت:
- `-xx: ParallelGcThreads =`: يعين عدد مؤشرات الترابط المستخدمة خلال المراحل المتوازية من GC. يمكن أن تقلل المزيد من المواضيع عن وقت الإيقاف المؤقت ولكن يمكن أن تزيد أيضًا من استخدام وحدة المعالجة المركزية.
- `-xx: concgcthreads =`: بالنسبة لهواة الجمع المتزامنة مثل CMS و G1 ، يحدد عدد المواضيع التي تؤدي المراحل المتزامنة.
- يجب أن يتماشى عدد مؤشرات الترابط الأمثل مع عدد نوى وحدة المعالجة المركزية المتوفرة وعبء العمل ؛ يمكن أن تؤدي المواضيع المفرطة في الانصهار إلى تدهور الأداء.
ضبط أحجام الجيل الصغير والكبار
عادة ما تنقسم الكومة إلى أجيال صغار وكبار. يؤثر ضبط أحجامها على سلوك GC:
- حجم الجيل الشاب: يقلل الجيل الشاب الأكبر من تواتر GCs البسيطة ولكنه يزيد من أوقات توقف GC البسيطة. ضبط بناء على معدل تخصيص الكائن.
- حجم الجيل القديم: يؤثر على عدد المرات التي يتم فيها تشغيل GCS الرئيسية/الكاملة ومدتها.
- يقوم G1 GC بتقسيم الكومة إلى العديد من المناطق ذات الحجم المتساوي ويدير حجمها ديناميكيًا ولكنه يتيح عتبات ضبط الضبط مع معلمات مثل `xx: interaingheapoccupancypercenced`.
جامع القمامة معلمات محددة
لـ G1 GC ، شائع الاستخدام في JVMs الحديثة:
- `-xx:+useg1gc`: تمكين G1 GC.
- `-xx: maxgcpausemillis =`: توقف وقت الإيقاف.
- `-xx: itingheapoccupancypercent =`: يبدأ وضع العلامات المتزامنة عندما يصل الكومة إلى هذا الإشغال.
- `-xx:+UsestringDeduplication`: يقلل من بصمة الذاكرة عن طريق سلاسل devuplicating.
- تجنب تحديد حجم الجيل الشاب بشكل صريح ، حيث يمكن أن يتداخل مع أهداف وقت توقف G1.
لـ CMS GC:
- `-xx:+useconcmarksweepgc`: تمكين CMS.
-التركيز على التوليف على تقليل توقف التوقف العالمي عن طريق ضبط عتبة البدء وعداد الخيوط.
ل GC المتوازي (الموجهة نحو الإنتاجية):
-`-xx:+useparalledgc` و` -xx:+ustparalleloldgc`: تمكين GC متوازي للأجيال الصغيرة والكبار.
- لحن عدد مؤشرات ترابط GC مع `-xx: parallelgcthreads`.
تقليل معدل تخصيص الكائنات
تقليل معدل إنشاء الكائنات الجديدة يقلل من ضغط GC:
- الملف الشخصي وتحسين الكود لتقليل إنشاء الكائن غير الضروري.
- استخدم تجميع الكائنات وإعادة استخدامها عندما يكون ذلك ممكنًا.
- اضبط معلمات JVM لتنظيم مناطق الذاكرة الداخلية لأنماط تخصيص الكائن أفضل.
تجنب مكالمات GC الصريحة
- تعطيل مكالمات GC الصريحة من رمز التطبيق أو الأدوات الخارجية التي يمكن أن تؤدي إلى توقف مؤقت GC الكامل باستخدام `xx:+disablexplicitgc`.
المراقبة والتسجيل
لفهم وضبط سلوك GC ، تمكين تسجيل GC مفصل:
- استخدم `-xlog: gc*` في JVMs دعم التسجيل الموحد (Java 9+).
-في JVMs الأقدم ، استخدم `-xx:+printgcdetails -xx:+printgcdatestamps -xloggc:`.
تحليل السجلات لتحديد أسباب توقف مؤقت وضبط وفقا لذلك.
توصيات عامة
- ابدأ في ضبط قائمة نظيفة عن طريق إزالة حجج JVM التي عفا عليها الزمن.
- اختبار التغييرات في بيئة تشبه الإنتاج.
- استخدم أدوات مثل Java Flight Recorder أو VisualVM أو Pfirlers التجاري لجمع بيانات استخدام الذاكرة.
- تكرار خطوات التوليف بناءً على أوقات الإيقاف المؤقت لـ GC الملاحظة ، والإنتاجية ، واستجابة التطبيق.
باختصار ، يتضمن التقليل إلى الحد الأدنى من تجميع القمامة JVM اختيار جامع القمامة المناسب (ويفضل أن يكون G1 أو ZGC أو Shenandoah لمتطلبات منخفضة الإيقاف المؤقت) ، وتحجيم الكومة والأجيال بشكل صحيح ، وتحديد أهداف الوقت الموقف ، ومواضيع توافق التوليف ، مما يزيد من معدل تخصيص الكائنات ، واضطراب الرسوم الوطنية ، ومراقبة دقيقة. تعتمد التفاصيل على عبء عمل التطبيق وحجم الكومة وإصدار JVM وخصائص الأجهزة. يجب إجراء التعديلات بشكل تدريجي والتحقق من صحة أدوات المراقبة وسجلات GC مفصلة لتحقيق التوازن المطلوب من الإنتاجية ووقت الإيقاف المؤقت.
يضمن هذا النهج أن مجموعة القمامة JVM تعمل بكفاءة مع الحد الأدنى من الاضطرابات لأداء التطبيق.