آشنایی با ماشین مجازی جاوا


در این آموزش قصد داریم تا به تفصیل مفهوم JVM یا همان ماشین مجازی جاوا را مورد بررسی قرار دهیم. در واقع از بدو ایجاد زبان برنامه نویسی جاوا شعار طراحان این زبان محبوب این بوده است که Write One, Run Anywhere! به این معنی که "یک بار برنامه جاوای خود را بنویسید سپس روی هر پلتفرمی که خواستید آن را اجرا کنید!" که چنین قابلیتی جز با به کاری گیری مفهومی تحت عنوان "ماشین مجازی جاوا" امکان پذیر نخواهد بود. به طور کلی ماشین مجازی جاوا را می توان در قالب تصویر زیر نشان داد:

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

از این پس این وظیفه ماشین های مجازی است که برنامه Compiled شده را به شکلی که برای پلتفرم مد نظر قابل فهم است تبدیل نماید. به عبارت دیگر ماشین های مجازی تمام تلاش خود را به کار خواهند بست تا از روی کد یکسانی نتایج نسبتاً یکسانی را در پلتفرم های مختلف ایجاد کنند. اکنون پس از آشنایی با نحوه عملکرد ماشین مجازی، قصد داریم تا بیشتر درباره ماهیت خود این ماشین مجازی نکاتی را بیان کنیم:


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

یکی از مزایای به کارگیری از Bytecode این است که از این طریق می توان دیگر زبان های برنامه نویسی را نیز داخل جاوا به کار برد. به عبارت دیگر، چنانچه زبان برنامه نویسی یی وجود داشته باشد که بتواند خود را به Bytecode قابل فهم برای جاوا Compile کند، ماشین مجازی جاوا خواهد توانست  آن بخش از کدی را که در زبان دیگری نوشته شده است را نیز در کنار کدهای جاوا اجرا سازد.

آشنایی با مفهوم Garbage Collection
منظور از واژه Garbage در زبان انگلیسی "زباله" است و واژه Collection نیز به معنی "جمع آوری" می باشد. زمانی که در زبان برنامه نویسی جاوا از این اصطلاح استفاده می کنیم منظور این است که ما به عنوان یک برنامه نویس جاوا نیازی نیست تا خود را درگیر مسائل مربوط به Memory یا "حافظه" کنیم چرا که این وظیفه ای است که بر عهده خود ماشین مجازی جاوا گذاشته شده است. برای روشن شدن نحوه عملکرد Garbage Collection مثالی می زنیم. حافظه در داخل برنامه‌های جاوا به دو قسمت تقسیم می‌شود، حافظه‌ی Heap و حافظه‌ی Stack. وقتی در یک برنامه آبجکتی را ایجاد می کنیم، مثلا شیئی از روی کلاس String ایجاد می کنیم:

String str = new String();

آبجکت تولید شده در حافظه‌ی Heap ذخیره می‌شود. توجه داشته باشید که str شیء نیست، بلکه ارجاعی به شیء ساخته شده در حافظه‌ی هیپ است. بنابراین متغیر str در حافظه‌ی Stack ذخیره شده است. در جاوا مفهوم اشارگر وجود ندارد اما در این قسمت می‌توان گفت که str یک نوع اشارگر است زیرا به شیئی که ساخته‌ایم در حافظه‌ی هیپ اشاره می‌کند.

در بیشتر منابع آموزشی گفته می‌شود که متغیر‌هایی مانند str شیء هستند که صحیح نیست! اما تقریبا تمام افراد متغیر‌هایی مانند str را با نام شیء صدا می‌کنند (حتی کسانی که از این موضوع با خبر هستند چرا که در گفتن راحت‌تر است.) بعد از این که آبجکت را ایجاد کردیم، با اجرای برنامه و در جایی از برنامه، آبجکت مورد نظر استفاده می‌شود و بعد از آن اگر دیگر از آن آبجکت استفاده نشود، آن آبجکت یک شیء «مُرده» به حساب می‌آید.

در زبان‌هایی مانند سی پلاس پلاس حذف کردن آبجکت‌های مُرده توسط برنامه نویس انجام می‌شود که این کار در برنامه‌های بزرگ و پیچیده به علت ارجاعات متعددی که آبجکت‌ها با یکدیگر دارند، فرآیندی بسیار سخت، پیچیده و پر خطا است اما در جاوا یک قابلیتی وجود دارد به نام Garbage Collector که وظیفه‌ی حذف آبجکت‌های مُرده در حافظه‌ی هیپ را بر عهده دارد. Garbage Collector بخشی از JVM است و الگوریتم‌های بسیار پیچیده‌ای دارد و فقط این را بدانید که هر از چند گاهی گاربج کالکتور به حافظه‌ی هیپ سر می‌زند و آبجکت‌های مُرده را پاک می‌کند تا حافظه آزاد شود. دقت داشته باشید که گاربج کالکتور فقط حافظه‌ی هیپ را پاک می‌کند. البته برنامه نویس هم می‌تواند گاربج کالکتور را فراخوانی کند، اما این کار اصلا توصیه نمی‌شود.

نکته
ماشین مجازی جاوا علاوه بر قابلیت های بسیاری که در اختیار برنامه نویسان می دهد محدودیت هایی را هم ایجاد می کند که البته این محدودیت ها جزو محدودیت های راه گشایی هستند که منجر به ارتقاء امنیت نرم افزارهای نوشته شده با زبان برنامه نویسی جاوا می شوند. به عبارت دیگر ماشین مجازی جاوا این اجازه را به هیچ وجه به ما نمی دهد تا بخشی از حافظه را که در اختیار دیگر بخش های برنامه است را به زور تصاحب کنیم تا بواسطه آن بتوانیم مثلاً یک شیئ جدید ایجاد کنیم. 
لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
عبدالحمید ارجمند
عبدالحمید ارجمندAndroid Developer - Java - عاشق گجتهای اپل و مایکــ
با سلام ، مثل همه ی آموزشها ، این قسمت نیز بینظیر و کاملا عمیق نوشته شده [خط ابتدای آموزش نیاز به ویرایش دارد : مفوم = مفهوم ]
ممنون بابت آموزش عالی
ادمین سایت
ادمین سایت
با سلام و تشکر از تذکر شما کاربر گرامی،
احتراماً به عرض می‌رساند که تایپو رفع گردید.


با تشکر
ارادتمند
تیم سکان آکادمی

در پاسخ به

کاربر میهمان
کاربر میهمان
با سلام و تشکر
تا اینجا به نظرعالی است ، هرچند که عملی هیچگونه کاری انجام نذاده ام ، مطمئنا ادا مه میدم و قبلا هم تشکر میکنم از مطالب بعدی!
Amin
Amin
تا اینجای کار که تا حالا عالی است پس ادامه به یادگیری.
fighter
fighter
bravo
کاربر میهمان
کاربر میهمان
سلام
واقعا ممنون....من یک برنامه نویس مبتدی هستم و اکیر کتابا رو نهایتا یک فصل می خوندم و نمی فهمیدم ولی آموزشای شما واقعا عالین.......
saeedprz
saeedprz
بی نظیر. خیلی از ابهامات یک ساله که هیچ منبعی جواب قابل فهم نداشت رو دستگیرم کرد. تشکر فراوان
کاربر میهمان
کاربر میهمان
با سلام ،
باتشکر از آموزش های خوبتون ، لطفا دوره های موجود در سایت رو به اتمام برسونید ، موفق و مؤید باشید ، بدرود.
parisan
parisan
سلام
ممنون از اموزش های عالی تون و خسته نباشید:)
shivap
shivap
خیییییلی خوووبه
علی یعقوبی
علی یعقوبی
خیـلی خوبه که آموزشا رایگانند. واقعا ممنون.
کاربر میهمان
کاربر میهمان
سلام.بله درست شد با CTRL + SPACE بالا میاد.ممنون
کاربر میهمان
کاربر میهمان
و یه سوال دیگه: چرا وقتی دارم کد مینویسم recommend اکلیپس یا همون کدهایی که باید پیشنهاد بده کار نمیکنه؟
CIna Deuxshiri
CIna Deuxshiri
شما CTRL + SPACE و نگه می‌دارید؟

در پاسخ به

کاربر میهمان
کاربر میهمان
سلام آغای دوشیری.بله درست میفرمایید . ولی من که تازه شروع کردم به یادگرفتن جاوا فک کنم بیشتر آموزشهای ابتدایی و مقدماتی برای مبتدیان با محیط eclips هستش.این دوتا یعنی eclips و android stodio با هم تفاوتی ندارن؟کتاب برنامه نویسی به زبان جاوای اغای صدیقی آموزشش با کدوم محیطه.پیشاپیش از اینکه جواب سوال رو میدین تشکر میکنم
CIna Deuxshiri
CIna Deuxshiri
سلام. من فکر کردم شما سوالتون در مورد اندروید هست. ببخشید :) از اکلیپس استفاده کنید. درضمن به سایت اوراکل برید و نسخه 8 جاوا رُ دانلود کنید. با نصب jdk دیگه نیازی به نصب چیزی نیست.

در پاسخ به

کاربر میهمان
کاربر میهمان
سلام به همه دوستان. تو رو خدا به دادم برسید دیگه کم کم دارم سکته میکنم. الان چند روزه که میخوام Repository های sdk رو نصب کنم هر کاری میکنم نمیشه.هر راهی که ممکن بود و امتحان کردم تغیر ای پی وی پی ان پروکسی... ولی چند درصد میره جلو و قطع میشه. اگه امکانش هست فایلشو بزارید یا لینک دانلود بدید به صورت آفلاین آپدیت کنیم.ممنون میشم کمک کنید. تشکر
CIna Deuxshiri
CIna Deuxshiri
سلام. دوست عزیز بهترین کار دانلود اندروید استدیو هست. (از سایت اصلی دانلود کن، اگر نمی‌تونی به سایت سافت گذر برو که ایرانی هم هست). اندروید استدیو شامل همه ابزار‌های لازم برای برنامه نویسی اندروید هست و دیگه نیازی نیست چیزی و خودت دانلود کنی.

در پاسخ به

who am i
who am i
ببخشید من متوجه نشدم در مثال گفته شده متغییر strدر حافظه هیپ ذخیره میشود یا stack
کاربر میهمان
کاربر میهمان
Nicetanx
zrdt
zrdt
واقعا ممنونم خیلی عالی بود
همه چیز عاااااااااااااااااااااااااااالی
Bahar
Bahar
خیلی ممنون.واقعا خسته نباشید
ُSoroush
ُSoroush
خیلی عالی بود،فقط ای کاش نسخه ی pdf هم ارائه میشد چون تبدیل وب به pdf خوب از آب در نمیاد.
hacker
hacker
ممنونم
hasein_hadi
hasein_hadi
فقط ممنون
iman
iman
من تازه درس رو شروع کردم ؛ واقعا سلیس و قابل فهم توضیح دادید ، از شما ممنونم که اینگونه سخاوتمندانه در جهت رشد و شکوفایی جوون های سرزمینمون تلاش میکنید
دست مریزاد
مرتضی کارگر
مرتضی کارگر
عالی بود...فقط یه مقدار از بروز نشدن یکسری از اموزش ها نگران شدم . امیدوارم این مسئله به زودی حل بشه
کاربر میهمان
کاربر میهمان
بسیار عالی توضیح داده بودین.متشکرم
mohammad saberi
mohammad saberi
بسیار شیوا و عالی ......