ה-Java Virtual Machine (JVM) הוא מרכיב ליבה של Java Runtime Environment (JRE) המאפשר לתוכניות Java לפעול בכל פלטפורמה ללא שינוי. JVM פועל כמתורגמן בין Java bytecode לבין החומרה הבסיסית המספק את יכולת ה-Wora Once Run Anywhere (WORA) המפורסמת של Java.
- מקור Java (.java) -> קומפילד על ידי javac -> קוד בייט (.class)
- JVM טוען את ה-bytecode מאמת שהוא מקשר אותו ואז מבצע אותו
- ביצוע עשוי להיות כרוך בפענוח bytecode או שימוש בקומפילציה של Just-In-Time (JIT) כדי להמיר קוד חם לקוד מכונה מקורי לביצועים
- איסוף אשפה פועל ברקע כדי להחזיר זיכרון מחפצים שאינם בשימוש
ארכיטקטורה של JVM
התמונה למטה מדגימה את הארכיטקטורה ומרכיבי המפתח של JVM.
רכיבים של JVM Architecture
כעת נדון בפירוט בכל רכיב של ה-JVM.
1. מערכת משנה מטעין כיתה
היא אחראית בעיקר לשלוש פעילויות.
1. טעינה
- קורא קבצי .class ומאחסן מטא נתונים של מחלקות באזור השיטה.
- יוצר אובייקט 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. קישור: אחראי על הכנת המחלקה הטעונה לביצוע. הוא כולל שלושה שלבים:
- אימות: מבטיח שקוד ה-byte עוקב אחר כללי JVM ובטוח לביצוע.
- הֲכָנָה: מקצה זיכרון למשתנים סטטיים ומקצה ערכי ברירת מחדל.
- הַחְלָטָה: ממירה הפניות סמליות להפניות ישירות בזיכרון.
3. אתחול
- מקצה ערכים בפועל למשתנים סטטיים.
- מבצע בלוקים סטטיים שהוגדרו במחלקה.
סוגי מעמיסים בכיתה
- Bootstrap Class Loader: טוען כיתות ליבה של Java (JAVA_HOME/lib).
- מטעין מחלקות הרחבה: טוען כיתות מספריית ההרחבות (JAVA_HOME/jre/lib/ext).
- מטעין מחלקת מערכת/אפליקציות: טוען מחלקות מ-classpath של האפליקציה.
// 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.
- אזור מחסנית: לכל שרשור יש מחסנית זמן ריצה משלו; שיטת stores קוראת למשתנים מקומיים במסגרות מחסנית. נהרס כשהחוט מסתיים.
- רישומי מחשב: החזק את הכתובת של ההוראה המופעלת כעת עבור כל שרשור.
- ערימות שיטה מקורית: לכל שרשור יש מחסנית נפרדת לביצוע שיטה מקורית.
3. מנוע ביצוע
מנוע ביצוע מבצע את ה-.class (bytecode). הוא קורא את קוד הבתים שורה אחר שורה, משתמש בנתונים ובמידע הקיימים באזורי זיכרון שונים ומבצע הוראות. ניתן לסווג אותו לשלושה חלקים:
- מְתוּרגְמָן: הוא מפרש את קוד הבתים שורה אחר שורה ואז מבצע. החיסרון כאן הוא שכאשר שיטה אחת נקראת מספר פעמים בכל פעם נדרשת פרשנות.
- מהדר בדיוק בזמן (JIT): הוא משמש להגברת היעילות של מתורגמן. הוא מרכיב את קוד הבתים כולו ומשנה אותו לקוד מקורי, כך שבכל פעם שהמתורגמן רואה קריאות חוזרות למתודה JIT מספק קוד מקורי ישיר עבור החלק הזה, כך שאין צורך בפרשנות מחדש ולכן היעילות משתפרת.
- אספן אשפה: זה הורס אובייקטים ללא הפניה. למידע נוסף על אספן אשפה עיין אספן אשפה .
4. ממשק מקורי של Java (JNI)
זהו ממשק המקיים אינטראקציה עם ספריות השיטה המקורית ומספק את הספריות המקוריות (C C++) הנדרשות לביצוע. זה מאפשר ל-JVM לקרוא לספריות C/C++ ולהיקרא על ידי ספריות C/C++ שעשויות להיות ספציפיות לחומרה.
5. ספריות שיטה מקורית
אלו הם אוספים של ספריות מקוריות הנדרשות לביצוע שיטות מקוריות. הם כוללים ספריות שנכתבו בשפות כמו C ו-C++.