كيف تعرف ما هي التحسينات التي تم تطبيق JVM على الكود الخاص بي؟
-
01-10-2019 - |
سؤال
تشتهر JVM (وخاصة النقطة الساخنة VM) بوجود عدد كبير من التحسينات التي يمكن أن تنطبق عليها في وقت التشغيل.
هل هناك طريقة للنظر إلى جزء معين من التعليمات البرمجية ومعرفة ما فعلته JVM بالفعل؟
المحلول
تتمثل إحدى المشكلات في أن "ما فعلته JVM فعليًا" يتغير بين الدعوات لأن JVM مجاني في إعادة ترتيب الكود.
على سبيل المثال ، قمت بالتحقيق قبل بضعة أيام ما الذي تفعله نقطة الساخنة مع final
الأساليب مقارنة بالطرق الافتراضية. إذا حكمنا من قبل Microbencharks ، كانت استنتاجاتي:
العميل JVM: إذا كانت الطريقة هي على نحو فعال
final
(لا يوجد أي فئة محملة تتجاوزها) ، يستخدم JVM مكالمة غير قديمة. بعد ذلك ، إذا قمت بتحميل فئة تتجاوز هذه الطريقة ، فسيقوم JVM بتغيير رمز jit'ed لإجراء المكالمات الظاهرية. لذلك أعلنfinal
ليس له صلة كبيرة.خادم JVM: هنا
final
يبدو أنه ليس له صلة أيضًا. ما يبدو أنه يحدث هو أن JVM يولد دعوة غير افتراضية لأي فئة تستخدمها المرة الأولى, بشكل مستقل عن أي فصول يتم تحميلها. بعد ذلك ، إذا قمت بإجراء مكالمة من كائن من فئة أخرى ، فسيقوم JVM بتصحيح جميع المكالمات بشيء مشابه لهذا إنها في المرة الأولى):
if (object instanceof ClassOfNonVirtualCall) { do non-virtual call to ClassOfNonVirtualCall.method } else { do virtual call to object.method }
إذا كنت مهتمًا حقًا برؤية التعليمات البرمجية المولدة ، فيمكنك اللعب مع Debug JVMs من OpenJDK:
نصائح أخرى
هذا محدد للغاية JVM ، وستحتاج على الأرجح إلى إجراء بعض التحقيقات الجادة في JVM المعينة التي تبحث عنها.
يمكنك رؤية خيارات Hotspot VM المتاحة هنا http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
ما يلي هو مورد جيد جدا:
http://wikis.sun.com/display/hotspotinternals/home
من المثير للاهتمام بشكل خاص روابط "Logompilation Tool" و "Logcompilation Overview" (لا يمكن نشر روابط مباشرة كما قمت بتسجيل للتو).
هذه صفحة جيدة على التحسينات نقطة ساخنة. يمكن رؤية بعض التحسينات من خلال النظر إلى رمز byteced المنبعث من قبل المترجم. التحسينات الأخرى ديناميكية ولا توجد إلا خلال فترة التشغيل. على سبيل المثال ، يمكن للنقطة الساخنة القيام بها بديل على المكاسب الذي يعدل المكدس مباشرة أثناء وقت التشغيل.