يعد Java Virtual Machine (JVM) مكونًا أساسيًا في Java Runtime Environment (JRE) الذي يسمح لبرامج Java بالعمل على أي نظام أساسي دون تعديل. يعمل JVM كمترجم بين Java bytecode والأجهزة الأساسية التي توفر إمكانية الكتابة بمجرد التشغيل في أي مكان (WORA) الشهيرة في Java.
- مصدر Java (.java) -> تم تجميعه بواسطة javac -> bytecode (.class)
- يقوم JVM بتحميل الرمز الثانوي والتحقق من ربطه ثم تنفيذه
- قد يتضمن التنفيذ تفسير التعليمات البرمجية الثانوية أو استخدام التحويل البرمجي في الوقت المناسب (JIT) لتحويل التعليمات البرمجية الساخنة إلى تعليمات برمجية أصلية للجهاز لتحقيق الأداء
- يتم تشغيل مجموعة البيانات المهملة في الخلفية لاستعادة الذاكرة من الكائنات غير المستخدمة
بنية JVM
توضح الصورة أدناه البنية والمكونات الرئيسية لـ JVM.
مكونات بنية JVM
سنناقش الآن كل مكون من مكونات JVM بالتفصيل.
1. النظام الفرعي لمحمل الفئة
وهي مسؤولة بشكل رئيسي عن ثلاثة أنشطة.
1. جاري التحميل
- يقرأ ملفات .class ويخزن بيانات التعريف الخاصة بالفئة في منطقة الطريقة.
- ينشئ كائن فئة في الكومة يمثل الفئة المحملة.
class GFG{ static{ System.out.println('GFG class is loaded by the JVM!'); } public void display(){ System.out.println('Method of GFG class is executed.'); } } public class Test{ public static void main(String[] args) throws Exception{ System.out.println('Main method started.'); // Loading the class explicitly using Class.forName() Class.forName('GFG'); System.out.println('Class loaded successfully.'); // Creating object to execute method GFG obj = new GFG(); obj.display(); } }
الإخراج
Main method started. GFG class is loaded by the JVM! Class loaded successfully. Method of GFG class is executed.
ملحوظة: لكل محملة .فصل الملف فقط واحد يتم إنشاء كائن الفئة.
2. الربط: المسؤول عن إعداد الفصل المحمل للتنفيذ. ويتضمن ثلاث خطوات:
عدد صحيح مزدوج جافا
- تَحَقّق: يضمن أن الكود الثانوي يتبع قواعد JVM وأنه آمن للتنفيذ.
- تحضير: يخصص الذاكرة للمتغيرات الثابتة ويعين القيم الافتراضية.
- دقة: تحويل المراجع الرمزية إلى مراجع مباشرة في الذاكرة.
3. التهيئة
- يعين القيم الفعلية للمتغيرات الثابتة.
- ينفذ الكتل الثابتة المحددة في الفصل.
أنواع محمل الفئة
- محمل فئة Bootstrap: يقوم بتحميل فئات Java الأساسية (JAVA_HOME/lib).
- محمل فئة الملحق: يقوم بتحميل الفئات من دليل الامتدادات (JAVA_HOME/jre/lib/ext).
- محمل فئة النظام/التطبيق: تحميل الفئات من مسار فئة التطبيق.
// Java code to demonstrate Class Loader subsystem public class Geeks { public static void main(String[] args) { // String class is loaded by bootstrap loader and // bootstrap loader is not Java object hence null System.out.println(String.class.getClassLoader()); // Test class is loaded by Application loader System.out.println(Geeks.class.getClassLoader()); } }
الإخراج
null jdk.internal.loader.ClassLoaders$AppClassLoader@8bcc55f
2. مناطق ذاكرة JVM
- منطقة الطريقة: يخزن معلومات على مستوى الفصل مثل متغيرات أساليب الفصل الأصلي لاسم الفصل والبيانات الثابتة. تمت مشاركتها عبر JVM.
- منطقة الكومة: يخزن كافة الكائنات. تمت مشاركتها عبر JVM.
- منطقة المكدس: يحتوي كل مؤشر ترابط على مكدس وقت التشغيل الخاص به؛ تستدعي طريقة المخازن المتغيرات المحلية في إطارات المكدس. دمرت عندما ينتهي الخيط.
- سجلات الكمبيوتر: احتفظ بعنوان التعليمات المنفذة حاليًا لكل موضوع.
- مكدسات الطريقة الأصلية: يحتوي كل مؤشر ترابط على مكدس منفصل لتنفيذ الطريقة الأصلية.
3. محرك التنفيذ
يقوم محرك التنفيذ بتنفيذ .class (الرمز الثانوي). يقرأ سطرًا من رمز البايت سطرًا ويستخدم البيانات والمعلومات الموجودة في مناطق الذاكرة المختلفة وينفذ التعليمات. ويمكن تصنيفها إلى ثلاثة أجزاء:
- مترجم: فهو يفسر سطرًا من الكود الثانوي ثم ينفذه. العيب هنا هو أنه عند استدعاء طريقة واحدة عدة مرات في كل مرة يكون التفسير مطلوبًا.
- المترجم في الوقت المناسب (JIT): يتم استخدامه لزيادة كفاءة المترجم. يقوم بتجميع الكود الثانوي بالكامل وتغييره إلى كود أصلي، لذلك عندما يرى المترجم استدعاءات الطريقة المتكررة، يوفر JIT كودًا أصليًا مباشرًا لهذا الجزء، لذلك لا يلزم إعادة التفسير وبالتالي يتم تحسين الكفاءة.
- جامع القمامة: إنه يدمر الكائنات غير المشار إليها. لمزيد من المعلومات حول جامع البيانات المهملة، راجع جامع القمامة .
4. واجهة جافا الأصلية (JNI)
إنها واجهة تتفاعل مع مكتبات الطريقة الأصلية وتوفر المكتبات الأصلية (C C++) المطلوبة للتنفيذ. إنه يمكّن JVM من الاتصال بمكتبات C/C++ ويتم استدعاؤها بواسطة مكتبات C/C++ التي قد تكون خاصة بالأجهزة.
5. مكتبات الطريقة الأصلية
هذه مجموعات من المكتبات الأصلية المطلوبة لتنفيذ الأساليب الأصلية. وهي تشمل مكتبات مكتوبة بلغات مثل C وC++.