برنامه نویسی

چگونه JVM کد شما را اجرا می کند: از کد بایت گرفته تا کد بومی

اگر در جاوا برنامه ریزی می کنید ، احتمالاً شنیده اید که “جاوا کند است”. اما آیا واقعاً؟ JVM یک دستگاه بهینه سازی واقعی است و اگر می فهمید که چگونه کار می کند ، می توانید از قدرت آن استفاده کنید. در این مقاله ، ما بررسی خواهیم کرد که چگونه کد شما از چیزی قابل خواندن توسط انسان به گرداب دستورالعمل های باینری که با سرعت کامل در پردازنده شما اجرا می شوند ، می رود.

1. از منبع تا بایت کد: اولین تحول

همه اینها با کد زیبا و خوش تیپ شما شروع می شود (یا شاید خیلی زیاد نباشد). وقتی کامپایل می کنید .java پرونده با javac، به یک باینری آماده برای اجرای سیستم عامل شما تبدیل نمی شود. در عوض ، کامپایلر تولید می کند کد بیت، مجموعه ای از دستورالعمل های میانی که JVM می فهمد.

این بدان معنی است که کد شما می تواند بر روی هر سیستم با نصب JVM اجرا شود. این مانند یک پاس جهانی است که جاوا را در هر مکانی اجرا می کند.

مثال اساسی کد جاوا:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, JVM!");
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

جمع بندی:

javac HelloWorld.java
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این یک تولید می کند HelloWorld.class پرونده ، که حاوی Bytecode است.

2. تفسیر Bytecode توسط JVM

در مترجم JVM آن کد را می گیرد و دستورالعمل آن را با دستورالعمل اجرا می کند. مانند یک مترجم همزمان بین کد شما و CPU کار می کند. این تضمین می کند که جاوا روی هر سکویی اجرا می شود ، اما می تواند کمی … آهسته باشد.

برای انجام کار خود ، JVM از پشته عملیاتی، جایی که در صورت لزوم مقادیر را فشار داده و پاپ می کند. هر روش تماس یک تماس می گیرد قاب پشته، اطمینان از جدا شدن و سازمان یافته همه چیز. این پشته برای اجرای صحیح برنامه ، ذخیره متغیرهای محلی ، مقادیر موقت و منابع به اشیاء ضروری است.

علاوه بر این ، JVM چندین مورد دارد مناطق حافظه این کمک به اعدام ، مانند:

  • پشته: جایی که اشیاء ایجاد شده پویا ذخیره می شوند.
  • جنجال: جایی که اطلاعات مربوط به کلاس ها ذخیره می شود.
  • پشته: جایی که تماس روش و متغیرهای محلی ذخیره می شود.

چرا تفسیر خالص می تواند ناکارآمد باشد؟

تفسیر خط به صورت انعطاف پذیر است ، اما می تواند کند باشد زیرا هر دستورالعمل باید به صورت جداگانه مورد تجزیه و تحلیل و اجرا قرار گیرد. تصور کنید که باید دو عدد میلیون بار اضافه کنید. انجام این کار از طریق مترجم بسیار طولانی تر از اجرای کد دستگاه خام است.

به همین دلیل JVM به تفسیر خالص نمی چسبد. این یک ترفند در آستین خود به نام کامپایلر فقط در زمان (JIT)، که ما به بعد نگاه خواهیم کرد.

3. کامپایلر فقط به موقع (JIT)

JVM به جای تفسیر هر خط هر بار که برنامه اجرا می شود ، می فهمد که از قسمت خاصی از کد استفاده می شود. این “نقاط مهم” سپس گردآوری می شوند فقط در زمان به کد دستگاه خالص ، نیاز به تفسیر را از بین ببرید.

این جادوی کامپایلربشر به صورت پویا بایت کد را به کد بومی تبدیل می کند و عملکرد بسیار بهبود می بخشد.

استراتژی های JIT

JVM استراتژی های مختلفی برای تدوین در زمان به موقع دارد که هر یک برای یک سناریوی خاص بهینه شده است:

مشتری (C1):

C1 بر روی تدوین سریع ، ایده آل برای برنامه های کوتاه مدت متمرکز است. این امر در کاهش تأخیر اولیه و ارائه عملکرد قابل قبول به سرعت و بدون انجام بهینه سازی های پیچیده ، برتری دارد. ویژگی اصلی آن امکان تهیه کارآمد و بدون به خطر انداختن زمان اجرا است. این مدل برای سناریوهایی مناسب است که سرعت پاسخ از عملکرد بلند مدت مهمتر است ، مانند برنامه های دسک تاپ که در آن راه اندازی سریع بسیار مهم است.

سرور (C2):

C2 با هدف بهبود عملکرد بلند مدت برای بهینه سازی های تهاجمی طراحی شده است. مزیت اصلی آن تولید کد بسیار بهینه شده پس از تجزیه و تحلیل الگوهای اجرای برنامه است. فرآیند تدوین C2 شامل جمع آوری آمار اجرای است که امکان تولید کد کارآمدتر را فراهم می کند. این نوع تدوین برای سرورها و برنامه هایی که به طور مداوم اجرا می شوند ایده آل است ، جایی که می توان با گذشت زمان ، مزایای بهینه سازی های پیشرفته را به طور کامل افزایش داد و عملکرد را برای سیستم های طولانی مدت به حداکثر برساند.

Graal JIT:

Graal JIT از عملکرد و انعطاف پذیری بالا و پشتیبانی از چندین زبان استفاده می کند. معماری مدرن آن در برخی شرایط از C2 بهتر است ، و به دلیل اینکه در جاوا نوشته شده است ، با زمینه های مختلف بسیار سازگار است. از تکنیک های پیشرفته بهینه سازی و تولید کد برای به حداکثر رساندن عملکرد استفاده می کند ، و سودهای قابل توجهی را به ویژه در سناریوهای خواستار تر ارائه می دهد. Graal JIT برای برنامه هایی که به بهترین عملکرد ممکن نیاز دارند ، مانند بارهای کاری یادگیری ماشین ، خدمات میکروسرویس و برنامه های کاربردی ابر ، ایده آل است ، جایی که کارآیی و مقیاس پذیری بسیار مهم است.

تالیف مرتب: بهترین های هر دو جهان

JVM از طرحی به نام استفاده می کند “تالیف مرتب”، که مزایای کامپایلر سریع C1 و کامپایلر بهینه شده C2 ​​را ترکیب می کند.

  • سطح 0: کد 100 ٪ تفسیر شده است ، بدون تالیف.
  • سطح 1 (C1 بدون بهینه سازی): کد برای بهبود عملکرد اولیه به سرعت گردآوری می شود.
  • سطح 2 (C1 با پروفایل های اعدام): JVM شروع به جمع آوری داده ها در مورد نحوه استفاده از کد می کند.
  • سطح 3 (C2 بهینه سازی شده): قسمتهای مهم کد با بهینه سازی تهاجمی برای حداکثر کارآیی مجدداً جمع می شوند.

با این طرح ، JVM می تواند به زمان پاسخ سریع بدون قربانی کردن عملکرد بلند مدتبشر این امر به ویژه برای برنامه هایی که نیاز به پاسخ سریع دارند ، مفید است اما برای مدت طولانی نیز اجرا می شود.

4. بهینه سازی پیشرفته JVM

JVM فقط کد را در زمان واقعی کامپایل نمی کند. همچنین بهینه سازی هایی مانند:

  • بی پروا: اگر یک روش کوچک است و اغلب نامیده می شود ، JVM می تواند آن را مستقیماً در مکانی که در آن فراخوانی شده است کپی کند و هزینه تماس روش را از بین ببرد.
  • تجزیه و تحلیل فرار: اگر JVM می بیند که یک شیء هرگز دامنه یک روش را ترک نمی کند ، می تواند به جای پشته ، آن را بر روی پشته اختصاص دهد ، عملکرد را بهبود بخشد و حجم کار جمع کننده زباله را کاهش دهد.
  • حذف کد مرده: اگر یک قطعه کد هرگز اجرا نشود ، JVM به سادگی آن را از نسخه کامپایل شده حذف می کند.
  • حلقه دور زدن: به جای اجرای یک حلقه چندین بار ، JVM می تواند یک حلقه کوتاه را به دنباله ای از عملیات مستقیم تبدیل کند و تعداد بررسی های شرایط را کاهش دهد.
  • بهینه سازی پیش بینی شاخه: JVM برای هماهنگی بهتر با پیش بینی جریان پردازنده ، کد را دوباره سازماندهی می کند و مجازات هایی را برای خرابی پیش بینی شعبه کاهش می دهد.

این بهینه سازی ها باعث می شود JVM مانند جادو به نظر برسد ، بدون اینکه برنامه نویس نیاز به بلند کردن انگشت داشته باشد ، کد قابل خواندن را به چیزی بسیار کارآمد تبدیل کند. بسیار چشمگیر ، درست است؟

پایان

همانطور که مشاهده می کنید ، JVM بسیار بیشتر از یک محیط زمان اجرا برای جاوا است. این یک فرایند بهینه سازی بسیار پیشرفته است. از تفسیر Bytecode گرفته تا تدوین فقط به موقع و بهینه سازی های پیشرفته ، JVM دائماً در تلاش است تا اطمینان حاصل شود که کد شما تا حد امکان کارآمد است.

بنابراین ، دفعه بعد که کسی می گوید “جاوا کند است” ، شما فقط می توانید لبخند بزنید و پاسخ دهید ، “JVM یک دستگاه عملکرد است ، و کسانی که می فهمند چگونه کار می کند می دانند چگونه می توانند از آن استفاده کنند.” 🚀

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا