مشخصات مقاله
آموزش ماشین مجازی در Java
آموزش Java – جزئیات داخلی و عملکرد (دستگاه مجازی جاوا) JVM
Java Virtual Machine یا به اختصار JVM یک دستگاه انتزاعی و مجرد پیاده سازی شده از روی یک دستگاه حقیقی مانند رایانه است که برنامه های نوشته شده با زبان Java را به مانند یک دستگاه واقعی اجرا می کند. گفتنی است که Java بر پایه ی معماری دستگاه مجازی تعبیه شده تا بدین وسیله بتواند امکان "یکبار کد را بنویس و در تمامی محیط ها آن را اجرا کن" را پیاده سازی کند. با توجه به آنچه گفته شد، دستگاه مجازی جاوا که همراه با JDK نصب می شود، این قابلیت را فراهم می کند که کد نوشته و کامپایل شده به زبان میانی/Bytecode را بدون نیاز به تغییر در هر دستگاهی که JVM بر روی آن مستقر شده، اجرا کند.
JVM ها برای تمامی محیطهای سخت افزاری و نرم افزاری به صورت اختصاصی ارائه می شود.
JVM چیست؟
- یک specification یا یک سند مشخصات و استاندارها است که به صورت کاملا رسمی توصیف می کند از برنامه ی پیاده سازی شده JVM چه قابلیت هایی انتظار می رود. با داشتن یک مستندات معتبر و رسمی این اطمینان حاصل می شود که تمامی برنامه های پیاده سازی شده JVM دارای ویژگی interoperability و قابلیت همکاری بایکدیگر می باشند. لازم به ذکر است که ارائه کننده ی برنامه ی پیاده سازی شده ی jvm در انتخاب الگوریتم آزاد هستند. برنامه ی پیاده سازی شده jvm علاوه بر شرکت Sun، توسط سایر شرکت ها نیز ارائه می شود.
- یک implementation یا برنامه ی کامپیوتری پیاده سازی شده بر اساس مشخصات و استانداردهای تعیین شده توسط مستندات رسمی (آیتم بالا) است که تحت عنوان JRE یا همان محیط اجرای جاوا شناخته می شود.
- Runtime Instance یا یک نمونه از کلاس جاوا است که در زمان اجرای برنامه ساخته می شود. به عبارت دیگر هر زمان که شما دستوری را در cmd جهت اجرای کلاس جاوا می نویسید، یک نمونه از JVM ساخته می شود. نمونه از JVM یک نسخه پیاده سازی شده از کلاس java است که در بستر فرایندی اجرا شده و برنامه ی کامپیوتری کامپایل شده به bytecode جاوا را اجرا می کند.
چه عملیاتی را انجام داده و چه وظایفی دارد؟
JVM کارهای زیر را انجام می دهد:
- کد را بارگذاری می کند
- صحت و درستی کد را بررسی می کند
- کد را اجرا می کند
- محیط اجرای برنامه را فراهم می کند
JVM موارد زیر تعیین می کند:
- Memory area یا ناحیه ای از حافظه ی heap که داده ها (آبجکت ها و آرایه ها) در زمان اجرا در آن ذخیره می شوند
- فرمت Class file (فایلی با پسوند .class که حاوی bytecode جاوا می باشد)
- Register set
- حافظه ی heap که آبجکت های بلااستفاده جمع آوری شده با garbage collection در آن نگه داری می شوند
- گزارش رخداد خطاهای مهلک
معماری داخلی JVM
در زیر به شرح معماری داخلی JVM می پردازیم. معماری JVM بخش هایی نظیر classloader، memory area، execution engine و غیره ... را شامل می شود.

Classloader
Classloader زیرسامانه ی برنامه ی JVM بوده و class file هایی که حاوی bytecode جاوا می باشد را در ناحیه ای به نام runtime data area یا مکان ذخیره ی داده های زمان اجرا بارگذاری می کند.
Class (Method) Area / ناحیه ی ذخیره ی اطلاعات کلاس
این ناحیه ساختارهای اختصاصی کلاس نظیر مجموعه ثوابت زمان اجرا (runtime constant pool)، فیلد، داده و کد مربوط به متدها را در خود ذخیره می کند.
Heap
ناحیه ای در حافظه که آبجکت ها در زمان اجرا در آن ذخیره می شوند.
Stack (حفاظه ی پشته)
ناحیه ی stack در حافظه که frame ها را در خود ذخیره می کند (stack در معنای کلی به ناحیه ای از حافظه گفته می شود که داده ها به صورت static و در زمان کامپایل در آن ذخیره می شوند). متغیرهای محلی و نتایج جزئی را نگه داشته و در فراخوانی متد و بازگردانی خروجی از آن متد، نقش دارد. هر thread یک JVM stack دارد که همزمان با thread ایجاد می شود. همچنین با هربار فراخوانی متد، یک frame جدید ساخته می شود. زمانی که فراخوانی متد خاتمه یافت، frame مربوطه حذف می شود.
Program Counter Register (شمارنده ی برنامه)
این واحد حافظه ای با دسترسی سریع و آسان در پردازنده ی رایانه است که آدرس دستوری از برنامه ی JVM که در زمان حاضر در حال اجرا است را در خود نگه می دارد.
Native method stack (حافظه پشته حامل متدهای native)
این واحد تمامی متدهای native که در اپلیکیشن بکار می روند را دربر می گیرد.
Execution Engine (موتور اجرا کننده)
این واحد خود بخش های زیر را شامل می شود:
- یک virtual processor: یک CPU فیزیکی که برای دستگاه مجازی تخصیص می یابد.
- مفسر یا interpreter: کدهای کامپایل شده به زبان میانی یا bytecode را خوانده و سپس دستورات را اجرا کند.
- Just-In-Time (JIT) Compiler (قابلیت کامپایل و ترجمه در لحظه): این واحد جهت افزایش سرعت اجرا و بهبود کارایی بکار می رود. JIT بخش هایی از bytecode که قابلیت و کارایی یکسان دارند را به طور همزمان ترجمه کرده و بدین وسیله زمان مورد نیاز برای کامپایل کلی کد را کاهش می دهد. لازم به ذکر است که در اینجا منظور واژه ی compiler، مترجمی است که مجموعه دستورات jvm را به کد یا دستورات قابل فهم برای پردازنده/cpu دستگاه میزبان تبدیل می کند.