ההבדל בין JVM, JRE ו- JDK

1. סקירה כללית

במאמר זה נדון בהבדלים בין JVM, JRE ו- JDK על ידי בחינת הרכיבים והשימושים בהם.

2. JVM

מכונת וירטואלית של Java (JVM) היא יישום של מכונה וירטואלית שמבצעת תוכנית Java.

ה- JVM מפרש לראשונה את קוד הביס. לאחר מכן הוא שומר את המידע בכיתה באזור הזיכרון. לבסוף, היא מבצעת את קוד הביס שנוצר על ידי מהדר Java.

זוהי מכונת מחשוב מופשטת עם ערכת הוראות משלה ומטפלת באזורי זיכרון שונים בזמן הריצה.

רכיבי ה- JVM הם:

  • מעמיסי כיתה
  • אזורי נתונים של זמן ריצה
  • מנוע ביצוע

2.1. מעמיסי כיתה

המשימות הראשוניות של ה- JVM כוללות טעינה, אימות וקישור קוד בתים. מעמיסי כיתה מטפלים במשימות אלה.

יש לנו מאמר מפורט במיוחד על מעמיסי כיתה.

2.2. אזורי נתונים של זמן ריצה

ה- JVM מגדיר אזורי זיכרון שונים להפעלת תוכנית Java. אלה משמשים בזמן ריצה ומכונים אזורי נתונים של זמן ריצה. חלק מהאזורים הללו נוצרים בהפעלת JVM ונהרסים כאשר ה- JVM יוצא ואילו חלקם נוצרים כאשר נוצר שרשור ונהרס כאשר יוצא שרשור.

בואו ניקח בחשבון את האזורים האלה בזה אחר זה:

אזור השיטה

ביסודו של דבר, אזור השיטה הוא אנלוגי לאזור האחסון עבור קוד מהודר. הוא מאחסן מבנים כגון מאגר קבוע בזמן ריצה, נתוני שדה ושיטה, הקוד לשיטות ובונים כמו גם שמות כיתות מלאים. JVM מאחסן מבנים אלה לכל שיעור וכיתה.

אזור השיטה, המכונה גם שטח ייצור קבוע (PermGen), נוצר עם הפעלת JVM. הזיכרון לאזור זה אינו צריך להיות רציף. כל שרשורי JVM חולקים את אזור הזיכרון הזה.

אזור ערימה

ה- JVM מקצה את הזיכרון לכל מופעי הכיתה והמערכים מאזור זה.

אספן האשפה (GC) מחזיר לעצמו את זיכרון הערימה. בעיקרון, ל- GC יש שלושה שלבים להחזרת זיכרון מאובייקטים כלומר. שני GC מינור ו- GC עיקרי.

לזיכרון הערימה יש שלוש מנות:

  • עדן חלל - זה חלק ממרחב הדור הצעיר. כשאנחנו יוצרים אובייקט, ה- JVM מקצה זיכרון מהמרחב הזה
  • מרחב ניצולים - הוא גם חלק ממרחב הדור הצעיר. שטח הישרדות מכיל אובייקטים קיימים ששרדו את שלבי ה- GC הקלים של GC
  • שטח קבוע - זה ידוע גם כחלל הדור הישן. הוא מחזיק חפצים ששרדו זמן רב. ביסודו של דבר, נקבע סף לאובייקטים מהדור הצעיר וכאשר סף זה עומד, אובייקטים אלה מועברים למרחב קבוע.

JVM יוצר שטח ערימה ברגע שהוא מתחיל. כל האשכולות של ה- JVM חולקים את האזור הזה. הזיכרון לאזור הערימה אינו צריך להיות רציף.

אזור ערימה

מאחסן נתונים כמסגרות וכל מסגרת מאחסנת משתנים מקומיים, תוצאות חלקיות ושיחות שיטה מקוננות. JVM יוצר את אזור הערימה בכל פעם שהוא יוצר שרשור חדש. אזור זה פרטי לכל שרשור.

כל ערך בערימה נקרא Stack Frame או רשומת הפעלה. כל פריים מכיל שלושה חלקים:

  • מערך משתנים מקומי - מכיל את כל המשתנים והפרמטרים המקומיים של השיטה
  • Stack Stack - משמש כשטח עבודה לאחסון תוצאת חישוב ביניים
  • נתוני מסגרת - משמש לאחסון תוצאות חלקיות, החזרת ערכים לשיטות והתייחסות ל- יוצא מן הכלל טבלה המספקת מידע חוסם תפיסה מתאים במקרה של חריגים

הזיכרון של מחסנית ה- JVM אינו צריך להיות רציף.

מחשבים אישיים

לכל שרשור JVM יש רישום PC נפרד המאחסן את כתובת ההוראה שמבצעת כעת. אם ההוראה המבצעת כעת היא חלק מהשיטה המקורית, ערך זה אינו מוגדר.

ערימות שיטה מקומית

שיטות מקומיות הן אלה שכתובות בשפות שאינן Java.

JVM מספק יכולות להתקשר לשיטות הילידים הללו. ערימות שיטות מקומיות ידועות גם בשם "ערימות C". הם מאחסנים את המידע על השיטה המקורית. בכל פעם שמרכיבים את השיטות המקוריות לקודי מכונה, הם בדרך כלל משתמשים בערמת שיטות מקוריות כדי לעקוב אחר מצבם.

ה- JVM יוצר ערימות אלה בכל פעם שהוא יוצר שרשור חדש. וכך נושאי JVM אינם חולקים את התחום הזה.

2.3. מנוע ביצוע

מנוע ביצוע מבצע את ההוראות באמצעות מידע הקיים באזורי הזיכרון. יש בו שלושה חלקים:

מְתוּרגְמָן

ברגע שמעמידי כיתות טוענים ומוודאים קוד קוד, המתורגמן מבצע את קוד הביצוע שורה אחר שורה. הביצוע הזה די איטי. החיסרון של המתורגמן הוא שכאשר שיטה אחת נקראת מספר רב של פעמים, בכל פעם שנדרש פרשנות חדשה.

עם זאת, ה- JVM משתמש ב- JIT Compiler כדי להקל על החיסרון הזה.

מהדר Just-In-Time (JIT)

מהדר JIT מרכיב את קוד הביס של השיטות המכונות לעתים קרובות לקוד מקורי בזמן הריצה. מכאן שהיא אחראית על אופטימיזציה של תוכניות Java.

JVM עוקב באופן אוטומטי אילו שיטות מבוצעות. ברגע ששיטה הופכת כשירה להרכבת JIT, היא מתוזמנת לאוסף לקוד מכונה. שיטה זו מכונה אז שיטה חמה. אוסף זה לקוד המכונה מתרחש בשרשור JVM נפרד.

כתוצאה מכך, הוא אינו מפריע לביצוע התוכנית הנוכחית. לאחר הידור לקוד המכונה, הוא פועל מהר יותר.

אוסף זבל

ג'אווה דואגת לניהול זיכרון באמצעות Garbage Collection. זהו תהליך של הסתכלות בזיכרון הערימה, זיהוי אילו אובייקטים נמצאים בשימוש ואילו לא, ולבסוף מחיקת אובייקטים שאינם בשימוש.

GC הוא חוט דמון. ניתן לקרוא לזה במפורש באמצעות מערכת.gc() עם זאת, היא לא תבוצע מיד ו- JVM מחליט מתי להפעיל את GC.

2.4. ממשק מקורי Java

הוא משמש כממשק בין קוד Java לספריות המקוריות (C / C ++).

ישנם מצבים בהם Java לבדה אינה עונה על הצרכים ליישום שלך, למשל יישום של תכונה תלויה בפלטפורמה.

במקרים אלה, אנו יכולים להשתמש ב- JNI כדי לאפשר להתקשר לקוד הפועל ב- JVM. לעומת זאת, הוא מאפשר לשיטות מקומיות להתקשר לקוד הפועל ב- JVM.

2.5. ספריות מקומיות

אלה ספריות ספציפיות לפלטפורמה ומכילות יישום של שיטות מקומיות.

3. JRE

Java Runtime Environment (JRE) הוא חבילה של רכיבי תוכנה המשמשים להפעלת יישומי Java.

מרכיבי הליבה של ה- JRE כוללים:

  • יישום של מכונה וירטואלית של Java (JVM)
  • שיעורים הנדרשים להפעלת תוכניות Java
  • קבצי נכסים

דנו ב- JVM בסעיף לעיל. כאן נתמקד בשיעורי הליבה ובקבצי התמיכה.

3.1. שיעורי Bootstrap

אנו נמצא שיעורי bootstrap תחת jre / lib /. נתיב זה ידוע גם כ- pathstrap classpath. זה כולל:

  • שיעורי זמן ריצה ב rt.jar
  • שיעורי בינאום ב i18n.jar
  • שיעורי המרת דמויות ב charsets.jar
  • אחרים

Bootstrap ClassLoader טוען שיעורים אלה כאשר ה- JVM מתחיל.

3.2. שיעורי הרחבה

אנחנו יכולים למצוא שיעורי הרחבה ב jre / lib / extn / המשמש כספרייה להרחבות לפלטפורמת Java. נתיב זה ידוע גם בשם מסלול הרחבה.

הוא מכיל ספריות זמן ריצה של JavaFX ב jfxrt.jar ונתוני אזור עבור java.text ו java.util חבילות ב localedata.jar. משתמשים יכולים גם להוסיף צנצנות מותאמות אישית לספריה זו.

3.3. הגדרות נכס

פלטפורמת Java משתמשת בהגדרות מאפיינים אלה כדי לשמור על תצורתה. בהתאם לשימוש בהם הם נמצאים בתיקיות שונות בפנים / jre / lib /. אלו כוללים:

  • תצורות לוח שנה ב לוח שנה. נכסים
  • תצורות רישום ב logging.properties
  • תצורות רשת ב net.properties
  • מאפייני פריסה ב / jre / lib / deploy /
  • נכסי ניהול ב / jre / lib / ניהול /

3.4. קבצים אחרים

מלבד הקבצים והשיעורים שהוזכרו לעיל, JRE מכיל גם קבצים לעניינים אחרים:

  • ניהול אבטחה ב jre / lib / אבטחה
  • הספריה להצבת שיעורי תמיכה ביישומונים בכתובת jre / lib / יישומון
  • קבצים הקשורים לגופן ב- jre / lib / פונטים ואחרים

4. JDK

ערכת פיתוח Java (JDK) מספקת סביבה וכלים לפיתוח, קומפילציה, ניפוי שגיאות וביצוע של תוכנית Java.

מרכיבי הליבה של JDK כוללים:

  • JRE
  • כלי פיתוח

דנו ב- JRE בסעיף לעיל.

כעת נתמקד בכלי פיתוח שונים. בואו לסווג כלים אלה בהתבסס על השימוש בהם:

4.1. כלים בסיסיים

כלים אלה מניחים את הבסיס של ה- JDK ומשמשים ליצירת ובניית יישומי Java. בין הכלים הללו אנו יכולים למצוא כלי עזר להידור, ניפוי באגים, ארכיב, יצירת ג'אדוקס וכו '.

הם כוללים:

  • javac - קורא הגדרות מחלקה וממשק ומרכיב אותן לקבצי כיתה
  • ג'אווה - משיק את יישום Java
  • javadoc - מייצר דפי HTML של תיעוד API מקובצי מקור של Java
  • מתאים - מוצא ומבצע מעבדי הערות על סמך ההערות הקיימות במערך קבצי המקור שצוינו
  • מציג יישומונים - מאפשר לנו להריץ יישומוני Java ללא דפדפן אינטרנט
  • צנצנת - אורז יישומוני Java או יישומים בארכיון יחיד
  • jdb - כלי ניפוי שורות פקודה המשמש לאיתור ותיקון באגים ביישומי Java
  • ג'אווה - מייצר כותרת C וקובצי מקור ממחלקה של Java
  • javap - מפרק את קבצי הכיתה ומציג מידע על שדות, בונים ושיטות הקיימים בקובץ כיתה
  • בדיקה חיצונית - מגלה התנגשויות גרסאות בין קובץ היעד של ארכיון Java (JAR) לבין קבצי JAR עם סיומות המותקנות כעת

4.2. כלי אבטחה

אלה כוללים כלי ניהול אישורים ואישורים המשמשים לתמרון Java Keystores.

Java Keystore הוא מיכל לאישורי אישור או אישורי מפתח ציבורי. כתוצאה מכך, הוא משמש לעתים קרובות על ידי יישומים מבוססי Java להצפנה, אימות והגשה באמצעות HTTPS.

כמו כן, הם עוזרים לקבוע את מדיניות האבטחה במערכת שלנו וליצור יישומים שיכולים לעבוד במסגרת מדיניות זו בסביבת הייצור. אלו כוללים:

  • כלי מפתח - מסייע בניהול ערכי מאגר המפתחות, כלומר מפתחות הצפנה ותעודות
  • jarsigner - מייצר קבצי JAR חתומים דיגיטלית באמצעות מידע על מאגר המפתחות
  • אמצעי משטרה - מאפשר לנו לנהל את קבצי תצורת המדיניות החיצוניים המגדירים את מדיניות האבטחה של ההתקנה

כמה כלי אבטחה מסייעים גם בניהול כרטיסי Kerberos.

Kerberos הוא פרוטוקול אימות רשת.

זה עובד על בסיס כרטיסים כדי לאפשר לצמתים שמתקשרים ברשת לא מאובטחת כדי להוכיח את זהותם זה לזה בצורה מאובטחת:

  • קיניט - נהג להשיג ולשמור במטמון כרטיסים להענקת כרטיסי Kerberos
  • ktab - מנהל שמות עקרוניים וזוגות מפתח בטבלת המפתחות
  • קליסט - מציג רשומות במטמון האישורים המקומי ובטבלת המפתחות

4.3. כלי הבינלאומי

בינאום הוא תהליך של עיצוב יישום כך שניתן יהיה להתאים אותו לשפות ואזורים שונים ללא שינויים הנדסיים.

לצורך זה מביא ה- JDK native2ascii. כלי זה ממיר קובץ עם תווים הנתמכים על ידי JRE לקבצים המקודדים ב- ASCII או Unicode.

4.4. כלי קריאה לשיטה מרחוק (RMI)

כלי RMI מאפשרים תקשורת מרחוק בין יישומי Java ובכך נותנים מרחב לפיתוח יישומים מבוזרים.

RMI מאפשר לאובייקט הפועל ב- JVM אחד להפעיל שיטות באובייקט הפועל ב- JVM אחר. כלים אלה כוללים:

  • רמיק - מייצר שיעורי בדל, שלד וקשירה לאובייקטים מרוחקים באמצעות פרוטוקול Java Remote Method Protocol (JRMP) או פרוטוקול אינטרנט בין-אורב (IIOP)
  • רגרגיסטיקה - יוצר ומתחיל רישום עצמים מרוחק
  • rmid - sמכוונן את הדמון של מערכת ההפעלה. זה מאפשר לרשום ולהפעיל אובייקטים במכונה וירטואלית של Java
  • סדרתי - מחזיר גרסה טורית UID עבור שיעורים שצוינו

4.5. Java IDL ו- RMI-IIOP כלים

שפת הגדרת ממשק Java (IDL) מוסיפה לפלטפורמת Java יכולת ארכיטקטורה מתווכת המבוססת על עצמים משותפים (CORBA).

כלים אלה מאפשרים ליישומי Java מבוזרים להפעיל פעולות בשירותי רשת מרוחקים באמצעות Object Management Group - OML - IDL.

כמו כן, נוכל להשתמש בפרוטוקול האינטרנט InterORB (IIOP).

RMI-IIOP, כלומר RMI מעל IIOP מאפשר תכנות של שרתי ויישומי CORBA באמצעות ה- RMI API. כך מאפשר חיבור בין שתי יישומים שנכתבו בכל שפה התואמת CORBA באמצעות פרוטוקול InterORB Internet (IIOP).

כלים אלה כוללים:

  • tnameserv - שירות שמות חולף המספק מדריך מובנה לעץ להפניות אובייקט
  • idlj - מהדר ה- IDL ל- Java ליצירת כריכות ה- Java עבור קובץ IDL שצוין
  • אורביד - לאפשר ללקוחות לאתר באופן שקוף ולהפעיל אובייקטים קבועים בשרת בסביבת CORBA
  • servertool - מספק ממשק שורת פקודה כדי לרשום או לבטל רישום של שרת קבוע ב- ORB Daemon (אורבד), הפעל וסגר שרת קבוע שרשום ב- ORB Daemon וכו '

4.6. כלי פריסת Java

כלים אלה מסייעים בפריסת יישומי Java ויישומונים באינטרנט. הם כוללים:

  • pack200 - הופך קובץ JAR ל- pack200 קובץ באמצעות Java gzip מַדחֵס
  • לפרוק 200 - הופכת pack200 קובץ לקובץ JAR

4.7. כלי התוסף של Java

JDK מספק לנו htmlconverter. יתר על כן, הוא משמש בשילוב עם תוסף Java.

מצד אחד, Java Plug-in יוצר קשר בין דפדפנים פופולריים לפלטפורמת Java. כתוצאה מחיבור זה, יישומונים באתר יכולים לפעול בתוך דפדפן.

מצד שני, htmlconverter הוא כלי עזר להמרת דף HTML המכיל יישומונים לפורמט עבור Java Plug-in.

4.8. כלי ההפעלה של Java

JDK מביא javaws. אנו יכולים להשתמש בו בשילוב עם Java Web Start.

כלי זה מאפשר לנו להוריד ולהפעיל יישומי Java בלחיצה אחת מהדפדפן. לפיכך, אין צורך להריץ תהליך התקנה כלשהו.

4.9. כלי ניטור וניהול

אלה כלים נהדרים שבהם אנו יכולים להשתמש כדי לפקח על ביצועי JVM ועל צריכת משאבים. הנה כמה מאלה:

  • jconsole - מספק קונסולה גרפית המאפשרת לך לפקח ולנהל יישומי Java
  • jps - מפרט את ה- JVM המכשירים במערכת היעד
  • jstat - עוקב אחר הסטטיסטיקה של JVM
  • jstatd - עוקב אחר יצירה והפסקה של JVM מכשירים

4.10. כלים לפתרון בעיות

אלה כלים ניסיוניים שנוכל למנף לצורך משימות לפתרון בעיות:

  • מידע - מייצר מידע תצורה עבור תהליך Java שצוין
  • jmap - מדפיס מפות זיכרון של אובייקטים משותפים או פרטי זיכרון ערימה של תהליך מוגדר
  • jsadebugd - מתחבר לתהליך Java ומשמש כשרת ניפוי באגים
  • jstack - מדפיס עקבות ערימת Java של שרשורי Java לתהליך Java נתון

5. מסקנה

במאמר זה זיהינו כי ההבדל הבסיסי בין JVM, JRE ו- JDK נעוץ בשימוש שלהם.

ראשית, תיארנו כיצד JVM היא מכונת מחשוב מופשטת שמבצעת בפועל את קוד ה- Java bytecode.

לאחר מכן, הסברנו כיצד להריץ יישומי Java פשוט, אנו משתמשים ב- JRE.

ולבסוף, הבנו כיצד לפתח יישומי Java, אנו משתמשים ב- JDK.

לקחנו גם זמן לחפור בכלים ומושגים בסיסיים של רכיבים אלה.