مقایسه نرم‌افزار مجازی‌سازی اپلیکیشن
مقایسه ماشین‌های مجازی

جدول زیر خلاصه ای از عناصری از کارآمدی ماشین‌ها مجازی است، و لیستی از تمام توانایی‌های موجود در هر پیاده‌سازی نیست!
| ماشین مجازی | مدل ماشین | مدیریت حافظه | امنیت کد | مفسر | کامپیال درجا | کامپایل جلوتر از زمان | کتابخانه‌های اشتراکی | مدل شیء زبان مشترک | سیستم نوع پویا |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ماشین زمان اجرا اندروید (آرت) (ART) | ماشین رجیستری (ثباتی) | خودکار | آری | آری | آری | آری | ؟ | آری | آری |
| زمان اجرا زبان مشترک (CLR) | ماشین پشته‌ای | خودکار یا دستی | آری | آری | آری | آری | آری | آری | آری |
| دیس (اینفرنو) | ماشین رچیستری (ثباتی) | خودکار | آری | آری | آری | آری | آری | آری | آری |
| DotGNU (.Net قابل حمل) | ماشین پشته‌ای | خودکار یا دستی | آری | آری | آری | آری | آری | آری | نه |
| ماشین مجازی جاوا (JVM) | ماشین پشته‌ای | خودکار | آری | آری | آری | آری | آری | آری | آری |
| JikesRVM | ماشین پشته‌ای | خودکار | آری | آری | آری | آری | ؟ | آری | آری |
| LLVM | ماشین رجیستری (ثباتی) | دستی | نه | آری | آری | آری | آری | آری | نه |
| مونو | ماشین پشته‌ای | خودکار یا دستی | آری | آری | آری | آری | آری | آری | آری |
| پروت | ماشین رجیستری (ثباتی) | خودکار | نه | آری | نه | آری | آری | آری | آری |
| دالویک | ماشین رجیستری (ثباتی) | خودکار | آری | آری | آری | نه | ؟ | نه | نه |
| اسکوییک | ماشین پشته‌ای | خودکار | نه | آری | آری | نه | آری | نه | آری |
| BEAM (ارلنگ) | ماشین رجیستری (ثباتی) | خودکار | ؟ | آری | آری | آری | آری | آری | آری |
| MoarVM | ماشین رجیستری (ثباتی) | خودکار | ؟ | آری | آری | آری | آری | آری | آری |
داده‌ها پردازش دستورالعمل‌ها ماشین مجازی در متغیرهای محلی از یک مدل محاسبات استفاده می‌کنند، که معمولاً یک ماشین پشته‌ای، ماشین ثبت، یا ماشین دسترسی تصادفی است که اغلب به نام ماشین حافظه نامیده می‌شوند. استفاده از این سه ماشین باعث ایجاد انگیزه‌ها مختلف شده‌است و ایجاد برتری‌هایی در ماشین‌های مجازی در مقابل ماشین‌های فیزیکی، مانند سهولت در تفسیر، کامپایل و تأیید برای امنیت می‌شود.
مدیریت حافظه در این ماشین‌های مجازی قابل حمل در سطح بالاتری از انتزاع نسبت به ماشین‌های فیزیکی آدرس دهی می‌شود. برخی از ماشین‌های مجازی مانند ماشین جاوا (JVM)، با آدرس‌ها به گونه‌ای درگیر هستند که با اجازه دادن به ماشین مجازی برای ردیابی ارجاع‌های اشاره‌گر، و غیرمجاز ساختن اشاره‌گرها دستی به حافظه، به مدیریت حافظه خودکار ایمن مجهز می‌شوند. سایر ماشین‌های مجازی، مانند LLVM، بیشتر شبیه ماشین‌های فیزیکی سنتی هستند که امکان استفاده مستقیم و دستکاری نشانگرها را فراهم می‌کنند. زبان متوسط معمولی (CIL) ترکیبی را در این بین ارائه می‌دهد که به هر دو امکان استفاده کنترل‌شده از حافظه را می‌دهد (مانند JVM، که مدیریت خودکار حافظه را امکان‌پذیر می‌کند)، در حالی که حالت «ناامن» را امکان‌پذیر می‌سازد که امکان دستکاری اشاره‌گرها را مستقیماً به روش‌هایی که می‌تواند مرزها تایپ متغیرها را نقض کند، مجوزهایی می‌دهد.
امنیت کد، به‌طور کلی به توانایی ماشین مجازی قابل حمل، برای اجرای کد در حالی که تنها مجموعه ای از توانایی‌ها را به کد ارائه می‌دهد، اشاره دارد. به عنوان مثال، ماشین مجازی ممکن است فقط به کد اجازه دسترسی به مجموعه خاصی از توابع یا داده‌ها را بدهد. کنترلرهای یکسانی بر روی پوینترها که مدیریت خودکار حافظه را ممکن می‌سازند و به ماشین مجازی اجازه می‌دهد از دسترسی ایمن به داده‌ها اطمینان حاصل کند، استفاده می‌شود. علت دیگر این کنترلرها این است که اطمینان حاصل شود که یک قطعه کد فقط به عناصر خاصی از حافظه دسترسی دارد و نمی‌تواند ماشین مجازی را دور بزند. سپس سایر مکانیسم‌های امنیتی به عنوان تأیید کننده کد، تأیید کننده پشته و سایر روش‌ها در بالای این کنترلرها قرار می‌گیرند.
یک مفسر اجازه می‌دهد تا برنامه‌های ساخته شده از دستورالعمل‌های مجازی بلافاصله بدون کامپایل پرهزینه در دستورالعمل‌های ماشین بومی بارگیری و اجرا شوند. هر ماشین مجازی که می‌تواند اجرا شود را می‌توان تفسیر کرد، بنابراین تعیین ستون در اینجا به این اشاره دارد که آیا طرح شامل مقرراتی برای تفسیر کارآمد (برای استفاده رایج) است یا خیر.
کامپایل درجا (JIT)، به روشی برای کامپایل کردن کد ماشین در کمترین زمان ممکن، معمولاً بلافاصله قبل یا در حین اجرای برنامه گفته می‌شود. چالش JIT بیشتر یک پیاده‌سازی است تا طراحی ماشین مجازی، با این حال، طراحی‌های مدرن کامپایلر شروع به ملاحظاتی برای کارایی برنامه کرده‌اند. ساده‌ترین روش JIT مانند کامپایل برنامه در یک کامپایلر آفلاین است. با این حال، اغلب از روش‌های پیچیده‌تری استفاده می‌شود که قطعات کد کامپایل‌شده را به بخش‌هایی(fragments) که فقط در زمان اجرا شناخته می‌شوند، اختصاص می‌دهند (به بهینه‌سازی تطبیقی مراجعه کنید).
کامپایل جلوتر از زمان (AOT) به روش کلاسیک تری استفاده از پیش کامپایلر برای تولید مجموعه ای از کد ماشین اشاره دارد که در طول زمان اجرای برنامه تغییر نمی‌کنند. از آنجا که کامپایل و بهینه‌سازی تهاجمی می‌تواند زمان بر باشد، یک برنامه از پیش کامپایل شده ممکن است سریعتر از برنامه ای که برای اجرا به JIT تنها متکی است راه اندازی شود. پیاده‌سازی JVM این هزینه راه‌اندازی را با تفسیر اولیه برای سرعت بخشیدن به زمان راه‌اندازی کاهش داده‌است تا زمانی که قطعات(fragments) کد ماشین توسط JIT تولید شوند.
کتابخانه‌های اشتراکی(Shared Library)توانایی ای برای استفاده مجدد از بخش‌های کد ماشین در چندین برنامه در حال اجرا هستند. در سیستم عامل‌های مدرن، این به‌طور کلی به معنای استفاده از حافظه مجازی برای به اشتراک گذاشتن صفحات حافظه(Memory Pages) حاوی یک کتابخانه مشترک در میان فرآیندهای مختلف است که از طریق روش‌ها حفاظت از حافظه محافظت می‌شوند. جالب است که روش‌های تهاجمی JIT مانند بهینه‌سازی تطبیقی اغلب قطعات کدی را تولید می‌کنند که برای اشتراک‌گذاری در بین فرایندها یا اجرای متوالی برنامه نامناسب هستند، که مستلزم یک معاوضه بین کارایی کد از پیش کامپایل شده و کد مشترک و مزایای کدهای تخصصی تطبیقی است. برای مثال، چندین مفاد طراحی CIL وجود دارد تا امکان کتابخانه‌های مشترک کارآمد را فراهم کند، احتمالاً به قیمت کد JIT تخصصی تر. پیاده‌سازی JVM در OS X از یک آرشیو مشترک جاوا برای ارائه برخی از مزایای کتابخانه‌های مشترک استفاده می‌کند.