اگر برنامه نویس جاوا هستید قطعا با JVM یا همان ماشین مجازی جاوا آشنایی دارید. در واقع JVM همان چیزی است که شعار معروف شرکت سان مایکروسیستم مبنی بر "یک بار بنویس و هر جایی آن را اجرا کن" را محقق می سازد. من امین کمپانی در این مقاله قصد دارم که به همراه شما به بررسی کامل ماشین مجازی جاوا بپردازم و ابعاد مختلف آن را که شاید کمتر با آن آشنایی داشته باشید را مورد بررسی قرار دهم.
ماشین مجازی جاوا دو هدف اصلی را دنبال می کند. در وهله اول وظیفه ماشین مجازی جاوا فراهم کردن محیطی برای اجرای برنامه های جاوا روی هر وسیله با هر سیستم عاملی است و در وهله دوم ماشین مجازی جاوا وظیفه مدیریت و بهینه سازی منابع حافظه آن سیستم را بر عهده دارد. جالب است بدانید که تا قبل از سال ۱۹۹۵ که جاوا معرفی شد تمام برنامه های کامپیوتری برای سیستم عامل مشخصی نوشته می شدند و این برنامه نویس بود که وظیفه مدیریت منابع حافظه سیستم را برعهده داشت.
اگر از یک برنامه نویس جاوا بپرسید که JVM دقیقا چیست و چگونه کار می کند شاید جوابی مشابه زیر بشنوید :
ماشین مجازی جاوا در واقع چیزی است که ما با آن برنامه هایی که به زبان برنامه نویسی جاوا نوشته ایم را اجرا می کنیم. ما تنظیمات JVM را پیکربندی می کنیم و بعد به آن اطمینان می کنیم تا در زمان اجرای برنامه منابع نرم افزار را مدیریت کند.
در واقع تاکید بیشتر برنامه نویس های جاوا در تعریف JVM به فرآیند کامپایل و اجرای کد اشاره دارد، این درحالیست که موارد گفته شده تمام چیزی نیست که ما به عنوان برنامه نویس جاوا باید از JVM توقع داشته باشیم.
ماشین مجازی جاوا به طور گسترده توسط برترین برنامه نویسان دنیا، هم به صورت سازمانی و هم به صورت متن باز توسعه پیدا می کند. برای مثال پروژه OpenJDK زاده تصمیم سان مایکروسیستم برای منتشر کردن جاوا به صورت اوپن سورس است. البته OpenJDK همچنان با سرپرستی اوراکل به کار خودش ادامه می دهد.
همانطور که قبلا هم اشاره کردم، تا قبل از پیدایش جاوا تمام حافظه اختصاص پیدا کرده به نرم افزار باید توسط برنامه نویس مدیریت می شد، اما در جاوا این وظیفه به JVM یا همان ماشین مجازی جاوا واگذار شده است. ماشین مجازی جاوا حافظه را طی فرآیندی که Garbage collection نامیده می شود مدیریت می کند، بدین صورت که به طور مداوم حافظه بی استفاده توسط نرم افزار را تشخیص می دهد و در صورتی که برنامه به آن نیاز نداشته باشد آن را رها می کند. Garbage collection همزمان با اجرای JVM شروع به کار می کند.
ما در مورد نقش ماشین مجازی جاوا در اجرای برنامه ها صحبت کردیم، اما کلاس ها و متدها چگونه اجرا می شوند ؟ در واقع اجرای یک نرم افزار جاوا بستگی به Java class loader و Java execution engine ماشین مجازی جاوا دارد.
در جاوا همه چیز در کلاس ها خلاصه شده اند، یک نرم افزار جاوا ممکن است از یک تا هزاران کلاس تشکیل شده باشد. به منظور اجرا کردن یک اپلیکیشن، JVM باید فایل class. کامپایل شده را به صورت یک فایل متنی بارگذاری کند که این فرآیند توسط class loader ماشین مجازی جاوا صورت می گیرد.
در واقع class loader بخشی از ماشین مجازی جاوا است که کلاس ها را در درون حافظه بارگذاری می کند و این امکان را فراهم می سازد تا کلاس ها برای اجرا در دسترس باشند. همچنین class loader ماشین مجازی جاوا از تکنیک هایی نظیر lazy-loading و caching برای بارگذاری هر چه کارآمدتر کلاس ها در درون حافظه استفاده می کند.
زمانی که کلاس لودر بارگذاری کلاس ها در حافظه را با موفقیت انجام داد، ماشین مجازی جاوا شروع به اجرای کدهای هر کلاس می کند. موتور اجرایی JVM کامپوننتی است که به این وظیفه رسیدگی می کند. از اینرو کار موتور اجرایی JVM در لحظه اجرای آن بسیار ضروری است یا به بیانی دیگر برای هر هدف کاربردی که دارید وجود موتور اجرایی JVM انکار ناشدنی است.
اجرای کد شامل مدیریت دسترسی به منابع سیستم نیز می شود. موتور اجرایی JVM دقیقا ما بین برنامه در حال اجرا که تقاضای دسترسی به منابع سیستم از جمله دسترسی به فایل ها، شبکه و منابع حافظه و همچنین سیستم عامل که وظیفه ارائه منابع به نرم افزار را دارد قرار می گیرد.
منابع سیستم می توانند به دو بخش بزرگ تقسیم بندی شوند : حافظه و هر چیز دیگری که در سیستم وجود دارد!
به خاطر می آورید که ماشین مجازی جاوا مسئول آزادسازی حافظه بلااستفاده سیستم است و garbage collection مکانیسمی است که این کار را انجام می دهد. وظیفه دیگری که JVM دارد تخصیص و نگهداری ساختارهای مرجعی است که برنامه نویس یا توسعه دهنده مجاز به استفاده از آنها است. برای مثال موتور اجرایی جاوا مسئول گرفتن چیزی شبیه کلمات کلیدی جدید در جاوا و تبدیل آن به یک درخواست از سیستم عامل برای اختصاص حافظه است. به غیر از حافظه، موتور اجرایی جاوا چیزهایی مثل دسترسی به فایل سیستم ها و ورودی خروجی های شبکه را نیز مدیریت می کند. نکته دیگری که دانستن آن خالی از لطف نیست این است که موتور اجرایی JVM همیشه با سیستم عامل در تعامل است. این بدان معناست که هر بار نرم افزار جاوا ما درخواست منابع از سیستم را دارد موتور اجرایی JVM باید نسبت به سیستم عامل نیز پاسخگو باشد.
در سال ۱۹۹۵، ماشین مجازی جاوا دو مفهوم انقلابی را معرفی کرد که بعدا تبدیل به یک استاندارد در برنامه نویسی مدرن شد: مفهوم "یکبار بنویس و هر جایی اجرا کن" و مدیریت اتوماتیک حافظه. تصور کنید که پدربزرگان برنامه نویس ما نسلی بوده اند که باید خودشان منابع حافظه سیستم را مدیریت می کردند و حالا ما نسلی هستیم که با garbage collector رشد کرده ایم.
از دیدگاه من جیمز گاسلینگ و برندان ایچ بی شک بنیانگذاران برنامه نویسی مدرن بوده اند و این در حالی است که هزاران نفر طی دو دهه بر پایه ایده آنها به توسعه نرم افزار می پردازند.با این حال علی رغم اینکه ماشین مجازی فقط برای جاوا توسعه پیدا کرده است، اما دامنه استفاده از آن به سایر زبان های برنامه نویسی از جمله Scala ، Groovy و Kotlin گسترش پیدا کرده است. راستش دوست دارم چشم انتظار آینده باقی بمانم. جایی که امیدوارم ماشین مجازی دیگر تکنولوژی برجسته ای در دنیای برنامه نویسی نباشد !