ترجمة JIT والترجمة متعددة المستويات
تعلّم كيف تفسّر JVM الأساليب كثيرة الاستخدام ثم تُترجمها باستخدام JIT، وكيفية تشغيل الترجمة ومراقبتها
ترجمة JIT والترجمة متعددة المستويات درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
المفسّر مقابل JIT
يفسّر JVM في البداية bytecode. وعندما تُستدعى طريقة كثيرًا، أي تصبح «ساخنة»، يصرّفها JIT إلى شفرة آلة أصلية لتنفيذها بسرعة أكبر بكثير.
التصريف متعدد المستويات (الافتراضي منذ Java 8)
يستخدم التصريف متعدد المستويات خمسة مستويات: T0 (المفسّر)، وT1 (C1 البسيط)، وT2 (C1 مع تحليل محدود)، وT3 (C1 مع تحليل كامل)، وT4 (C2 المحسّن بالكامل). وتنتقل الطرق إلى مستويات أعلى كلما ازداد استخدامها.
// Enable/disable tiered compilation:
// -XX:+TieredCompilation (default ON in Java 8+)
// -XX:-TieredCompilation (disables — only C2 used)مصرّف C1 (مصرّف العميل)
يصرّف C1 بسرعة مع تحسين متوسط. ويضيف أدوات لجمع معلومات الأداء لقياس تكرار الاستدعاءات ونتائج الفروع لصالح C2.
مصرّف C2 (مصرّف الخادم)
ينفّذ C2 (Opto) تحسينات عميقة، مثل التضمين، وتحليل الهروب، وفكّ حلقات التكرار، وتحويل المتجهات، وحذف الشفرة الميتة. وينتج أسرع شفرة أصلية، لكنه يستغرق وقتًا أطول في التصريف.
// Force server JIT only:
java -server MyApp
// Or explicitly:
java -XX:-TieredCompilation MyApp // uses C2 only (warm-up is slower)عتبة HotSpot
تُصرَّف الطريقة باستخدام JIT بعد تجاوز عتبة في عداد الاستدعاءات. والقيمة الافتراضية هي 10,000 استدعاء (C2). ويمكن ضبطها باستخدام -XX:CompileThreshold=N.
// Lower threshold for faster warm-up (at cost of less optimization):
java -XX:CompileThreshold=1000 MyAppالتضمين
يُعد التضمين أكثر تحسينات C2 تأثيرًا: إذ تُنسخ الطرق الصغيرة التي تُستدعى من شفرة ساخنة في موضع الاستدعاء، مما يلغي تكلفة توزيع الاستدعاءات ويفتح المجال أمام تحسينات إضافية.
// Check inlining decisions:
java -XX:+PrintInlining -XX:+UnlockDiagnosticVMOptions MyApp
// Output:
// @ 5 com.example.User::getName (5 bytes) inlinedتحليل الهروب
إذا حدد C2 أن كائنًا لا يخرج من نطاق الطريقة الحالية (أو الخيط)، فيمكنه تخصيصه على المكدس بدلًا من الكومة، مما يلغي ضغط GC بالكامل.
// Objects that don't escape are stack-allocated:
String result = new StringBuilder().append("Hello ").append(name).toString();
// The StringBuilder may be eliminated by escape analysisسجلات تصريف JIT
استخدم -XX:+PrintCompilation لتسجيل كل طريقة أثناء تصريفها. وتعرض المخرجات اسم الطريقة ومستواها وأعلام التصريف.
// java -XX:+PrintCompilation MyApp
// Output:
// 1 n java.lang.String::hashCode (0 bytes)
// 25 3 com.example.UserService::findById (42 bytes)
// 31 4 com.example.UserService::findById (42 bytes) made not entrantإلغاء التحسين
إذا خالف التنفيذ باستخدام JIT افتراضًا ما، مثل تحميل فئة تغيّر نوع مستقبل موضع الاستدعاء، ينفّذ C2 «إلغاء التحسين»، فيعود إلى المفسّر أو C1. وهذا أمر طبيعي ويحدث عادةً بشفافية.
زمن الإحماء
يستغرق تصريف JIT وقتًا. وفي العمليات قصيرة العمر، قد لا تُصرَّف الطرق باستخدام JIT أبدًا. استخدم التصريف المسبق (GraalVM Native Image)، أو خزّن نتائج JIT مؤقتًا باستخدام مشاركة بيانات الفئات (CDS) لتسريع بدء التشغيل.
// Enable AppCDS to cache JIT-compilable classes:
java -XX:ArchiveClassesAtExit=app.jsa -cp app.jar MyApp # generate archive
java -XX:SharedArchiveFile=app.jsa -cp app.jar MyApp # use archiveJIT في GraalVM
يستبدل GraalVM C2 بمترجم JIT مكتوب بلغة Java. ويتيح تحسينات أفضل، وإمكانية استخدام JIT للغات غير Java، وهو الأساس لـ Native Image (التصريف المسبق).
تحقق سريع
ما تقنية تصريف JIT التي تلغي تكلفة استدعاء الطريقة بدمج الطرق الصغيرة داخل الطريقة المستدعية؟
مراجعة
ينقل التصريف متعدد المستويات الطرق من C1 (تصريف سريع وجمع معلومات الأداء) إلى C2 (تحسين عميق). وتشمل التحسينات الأساسية: التضمين، وتحليل الهروب، وفكّ حلقات التكرار. استخدم -XX:+PrintCompilation لمراقبة قرارات JIT. وأجرِ الإحماء قبل قياس الأداء.
الأسئلة الشائعة
هل درس «ترجمة JIT والترجمة متعددة المستويات» مجاني؟
نعم — نص درس «ترجمة JIT والترجمة متعددة المستويات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «ترجمة JIT والترجمة متعددة المستويات»؟
تعلّم كيف تفسّر JVM الأساليب كثيرة الاستخدام ثم تُترجمها باستخدام JIT، وكيفية تشغيل الترجمة ومراقبتها تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «ترجمة JIT والترجمة متعددة المستويات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مراحل تحميل الفئات: التحميل والربط والتهيئة
- التسلسل الهرمي لـ ClassLoader ومحملات الفئات المخصصة
- فحص البايت كود باستخدام javap
- ترجمة JIT والترجمة متعددة المستويات