Execution Engine
bytecode ها اینجا اجرا میشن. Execution Engine دستورات رو خط به خط اجرا میکنه. و از بخشهای زیر تشکیل شده.
- Interpreter: این بخش bytecode ها رو تفسیر میکنه و دستورات رو خط به خط اجرا میکنه. تفسیر یک خط کار خیلی سریعی هستش ولی اجرای اون کنده. عیبش این هستش که وقتی ما یک متد رو چند بار صدا بزنیم هر بار کندتر میشه. برداشت شخصیم متدهای تو در تو هستش !!!
- Just-In-Time Compiler: اگه فقط مفسر وجود داشته باشه وقتی یک متد رو چند بار فراخوانی کنیم هر بار تفسیر میشه و که اگه درست کنترل بشه یک عمل بیفایدهست. دلیل وجود JIT این هستش که این مشکل رو حل کنه. در ابتدا کل bytecode رو به زبان ماشین کامپایل میکنه، بعدش برای متدهای تکراری کد از قبل کامپایل شده رو ارائه میده که خیلی سریعتر از اونی هستش که بخواد دوباره کد رو تفسیر کنه. کد کامپایل شده رو توی cache نگهداری میشه تا بشه سریع اجرا بشه.
- باید توجه کنیم که JIT به زمان بیشتری برای کامپایل نیاز داره تا interpreter برای تفسیر کد. اگه ی قطعه کد فقط یک بار لازمه اجرا بشه بهتر تفسیر بشه بجای اینکه کامپایل بشه و کد کامپایل شده توی cache ذخیره میشه که گروه هستش. برای حل این مشکل JIT خودش چک میکنه و متد های که زیاد اجرا میشن رو پیدا میکنه و اونها رو برای کامپایل انتخاب میکنه. اسم این کار adaptive compiling هستش و توی Oracle Hotspot VM استفاده میشه.
- JVM کلی بهینه ساز عملکرد (performance optimization) داره که چهارتاشون خیلی خوبن:
- Intermediate Code Generator: کد میانی درست میکنه
- Code Optimizer: کی که ICG ساخته رو بهینه میکنه
- Target Code Generator: کد ماشین رو تولید میکنه
- Profiler: نقطه ضعفهایی که پرفورمنس رو کاهش میدن رو پیدا میکنه
- دوتا رویکرد برای بهینه سازی کامپایل داریم:
- Oracle Hotspot VMs: اوراکل دوتا پیاده سازی از کامپایلر EES توی JVM داره که بهشون میگه Hotspot Compiler. تو مرحله profiling که میتونه نقطه ضعفها رو پیدا کنه به JIT میگه کدوم قسمت از کدها رو به کد ماشین کامپایل کنه و cache کنه، بعد ی مدت اگه ببین اشتباه کرده و این کدها پرکاربرد نیستن، اونها رو از cache پاک میکنه و اجرای اون قسمت از کد ها رو به interpreter واگذار میکنه. این کار با جلوگیری کردن از کامپایل بیمورد باعث بالا رفتن بازدهی میشه. در ضمن Hotspot Compiler خودش در لحظه تصمیم از چه تکنیکی برای کامپایل استفاده کنه. آنالیز عملکرد در زمان اجرا برنامه به ما این امکان رو میده که قاطعانه تصمیم بگیریم کدوم تکنیک بهتره.
- Oracle Java Hotspot Client: این تکنولوژی بهینه شده تا با کاهش زمان اجرا و حافظه مصرفی بازدهی رو برای سرویس گیرنده ها بیشتر کنه.
- Oracle Java Hotspot Server: این تکنولوژی برای بالاترین بازدهی بر روی سرور ها طراحی شده است و بهش میگن Advanced Dynamic Optimizing Compiler و از کلی تکنیکهای بهینه سازی پیچیده استفاده میکنه و موقع اجرا کردنش توی خط فرمان مثلا باید بگیم java server MyApp. این تکنولوژی اوراکل معروف هستش به اینکه خیلی سریع حافظه رو تخصص میده و خیلی سریع اون رو آزاد میکنه و به صورت خیلی مقیاسپذیری میتونه پردازشهای موازی رو سرورهایی با CPU های خفن مدیریت کنه.
- Ahead-Of-Time Compiling: این تکنولوژی رو IBM معرفی کرده و اینجوری هستش که کد کامپایل شده رو میریزه تو cache تا هر موقع لازم بود کد ازش استفاده کنه و البته میشه این کد کامپایل شده رو هم باقی JVM ها بدون نیاز به کامپایل انتقال داد. و ضمنا IBM یه راه سریع هم برای اجرا کدها ارائه داده که بهش میگه JXE که مخفف Java Executable هستش. فقط باید دقت کنید ک برای استفاده از این قابلیت باید با AOT کدتون رو کامپایل کرده باشید.
- Garbage Collector: تا زمانی برنامه که به یک شی رجوع میکند (خوندن، تغییر دادن یا مقدار دهی مجدد کردن)، JVM اون شی رو زنده در نظر میگیره. وقتی پس از گذشت زمانی معین هیچکی به اون شی سر نزنه، اون شی رو غیر قابل دسترس در نظر میگیره و GC اون شی رو حذف میکنه و حافظه اون رو آزاد میکنه. در حقیقت GC به صورت یک daemon thread هستش و خود JVM استارت میکنه ولی ما هم میتونیم با system.gc اون رو فراخوانی کنیم.
+ نوشته شده در جمعه ۱۸ تیر ۱۴۰۰ ساعت 20:38 توسط No One