Java Flight Recorder
تحليل أداء منخفض الكلفة
Java Flight Recorder درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
ما هو JFR؟
Java Flight Recorder (JFR) هو محرك لتحليل الأداء وجمع الأحداث، مضمّن مباشرةً في JVM.
يسجل أحداثًا تفصيلية أثناء التشغيل — عينات الأساليب، والتخصيصات، وGC، والأقفال، وIO — في ملف ثنائي .jfr، مع حمل إضافي منخفض جدًا. وهو مرفق مع JDK ولا يحتاج إلى وكيل إضافي.
لماذا يهم انخفاض الحمل الإضافي
قد تبطئ محللات الأداء التقليدية المعتمدة على instrumenting التطبيق بمقدار الضعف أو أكثر، فتشوّه التوقيتات نفسها التي تريدون قياسها.
صُمم JFR ليعمل في الإنتاج مع حمل إضافي يبلغ عادةً نحو 1%. وهذا يعني أنه يمكنكم تركه قيد التشغيل والتقاط تسجيل عند وقوع حادثة حقيقية، وليس في بيئة الاختبار فقط.
بدء تسجيل عند التشغيل
فعّلوا JFR باستخدام خيار JVM عند بدء تطبيقكم:
-XX:StartFlightRecording=duration=60s,filename=app.jfr
يسجل هذا الأحداث لمدة 60 ثانية، ثم يكتبها في app.jfr. ويمكنكم أيضًا بدء تسجيل يستمر حتى خروج JVM.
التحكم باستخدام jcmd
يمكنكم أيضًا بدء التسجيلات وإيقافها وتفريغها على JVM قيد التشغيل باستخدام jcmd:
jcmd <pid> JFR.start name=rec settings=profilejcmd <pid> JFR.dump name=rec filename=out.jfrjcmd <pid> JFR.stop name=rec
وهذا مثالي لالتقاط لقطة من عملية بدأت تعمل بشكل غير صحيح.
الإعدادات: default مقابل profile
يأتي JFR بإعدادين مضمّنين:
- default — حمل إضافي أدنى، وآمن للاستخدام المستمر في الإنتاج.
- profile — أخذ عينات أكثر تفصيلًا، بتكلفة أعلى قليلًا، للتحقيق المركز.
اختاروا ذلك باستخدام settings=profile. ويمكنكم أيضًا كتابة إعداد مخصص بصيغة .jfc لضبط الأحداث الفردية.
ما الذي يسجله JFR
يلتقط JFR مجموعة غنية من الأحداث، منها:
- عينات التنفيذ، التي توضح أين يذهب وقت CPU.
- تخصيص الكائنات ونشاط TLAB.
- فترات توقف جمع البيانات المهملة.
- تنازع الأقفال (
jdk.JavaMonitorWait). - عمليات IO الخاصة بالملفات والمقابس، وإيقاف الخيوط مؤقتًا، والاستثناءات.
يحتوي كل حدث على طابع زمني ومدة وتتبع مكدس.
أحداث مخصصة
يمكنكم تعريف أحداث JFR الخاصة بكم لقياس زمن منطق الأعمال. وسّعوا jdk.jfr.Event، وأضيفوا التعليق التوضيحي إليه، ثم استدعوا begin() / commit() حول العمل.
هذا هو الجزء الملائم للتشغيل المستقل من API الخاص بـ JFR. ولا يزال التسجيل الفعلي يحتاج إلى خيارات JVM، لكن فئة الحدث تُترجم وتعمل على أي JDK.
import jdk.jfr.Event;
import jdk.jfr.Label;
public class Main {
@Label("Order Processing")
static class OrderEvent extends Event {
@Label("Order Id") int orderId;
}
public static void main(String[] args) {
OrderEvent e = new OrderEvent();
e.orderId = 42;
e.begin();
// ... do the work being measured ...
e.commit();
System.out.println("Custom JFR event committed for order " + e.orderId);
}
}التسجيل المستمر
بالنسبة إلى الخدمات طويلة التشغيل، شغّلوا تسجيلًا مستمرًا بحجم أو عمر أقصى (أي مخزنًا حلقيًا).
تُحذف الأحداث القديمة عند وصول أحداث جديدة، ولذلك يظل استخدام القرص محدودًا. وعند وقوع حادثة، تفرغون المخزن فتحصلون فورًا على الدقائق التي سبقتها.
التفريغ عند الخروج
أضيفوا dumponexit=true إلى خيار start-flight-recording، وسيكتب JFR محتويات المخزن عند إيقاف تشغيل JVM.
اجمعوا ذلك مع -XX:FlightRecorderOptions لضبط حجم المخزن. ويضمن هذا التقاط البيانات حتى من عملية توشك على الانتهاء.
قراءة الملف
ملف .jfr ثنائي. تحللونه بصريًا في JDK Mission Control (في الدرس التالي)، أو برمجيًا باستخدام API jdk.jfr.consumer وRecordingFile.
يمكن لأداة سطر الأوامر jfr print app.jfr أيضًا تفريغ الأحداث كنص لتسهيل البحث السريع باستخدام grep.
بث الأحداث مباشرة
منذ JDK 14، يدعم JFR بث الأحداث عبر API jdk.jfr.consumer.RecordingStream.
بدلًا من تفريغ ملف وفتحه لاحقًا، تشتركون في الأحداث فور وقوعها وتتفاعلون معها في الوقت الفعلي — مثلًا، بإرسال تنبيه عند تجاوز فترات توقف GC حدًا معينًا. وهكذا يتحول JFR إلى مصدر مراقبة مباشر، لا مجرد أداة لتحليل ما بعد الحادثة.
تحقق سريع
ما السبب الرئيسي الذي يتيح ترك JFR قيد التشغيل في الإنتاج؟
خلاصة
JFR هو مسجل بيانات الرحلة المضمّن في JVM:
- جمع أحداث منخفض الحمل الإضافي وآمن للإنتاج في ملفات
.jfr. - يُبدأ عبر
-XX:StartFlightRecordingأوjcmd JFR.start. - اختاروا إعدادات default أو profile، وعرّفوا أحداثًا مخصصة.
- استخدموا التسجيل المستمر بالمخزن الحلقي و
dumponexit. - حللوا التسجيلات في JDK Mission Control في الدرس التالي.
الأسئلة الشائعة
هل درس «Java Flight Recorder» مجاني؟
نعم — نص درس «Java Flight Recorder» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «Java Flight Recorder»؟
تحليل أداء منخفض الكلفة تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «Java Flight Recorder»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تحديد الاختناقات
- Java Flight Recorder
- التحليل باستخدام JDK Mission Control
- أعلام ضبط JVM الشائعة