ניטור יישומי Java באמצעות מקליט טיסה

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

במדריך זה נבחן את Java Flight Recorder, מושגיו, פקודותיו הבסיסיות וכיצד להשתמש בו.

2. כלי עזר לניטור Java

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

ה פַּח תיקיית הפצת JDK מכילה, בין היתר, את התוכניות הבאות שיכולות לשמש לפרופיל וניטור:

  • Java VisualVM (jvisualvm.exe)
  • ג'קונסולה (jconsole.exe)
  • בקרת משימות ג'אווה (jmc.exe)
  • כלי פקודת האבחון (jcmd.exe)

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

במדריך זה נתמקד במקליט הטיסה של Java. זה לא קיים בין הכלים שהוזכרו לעיל מכיוון שזה לא תוכנית עצמאית. השימוש בו קשור קשר הדוק לשניים מהכלים לעיל - Java Mission Control ו- Diagnostic Command Tools.

3. מקליט הטיסה של Java ותפיסותיו הבסיסיות

Java Flight Recorder (JFR) הוא כלי ניטור ש- אוסף מידע על האירועים במכונת וירטואלית של Java (JVM) במהלך ביצוע יישום Java. JFR הוא חלק מהפצת JDK, והוא משולב ב- JVM.

JFR הוא נועד להשפיע על הביצועים של יישום פועל כמה שפחות.

על מנת להשתמש ב- JFR, עלינו להפעיל אותו. אנו עשויים להשיג זאת בשתי דרכים:

  1. בעת הפעלת יישום Java
  2. העברת פקודות אבחון של ה- jcmd כלי כאשר יישום Java כבר פועל

ל- JFR אין כלי עצמאי. אנו משתמשים ב- Java Mission Control (JMC), המכיל תוסף המאפשר לדמיין את הנתונים שנאספו על ידי JFR.

שלושת המרכיבים הללו - JFR, jcmd ו JMC - ליצור חבילה שלמה לאיסוף מידע זמן ריצה ברמה נמוכה של תוכנית Java פועלת. אנו עשויים למצוא מידע זה שימושי מאוד בעת אופטימיזציה של התוכנית שלנו, או כאשר אנו מאבחנים אותה כאשר משהו משתבש.

אם במחשב שלנו מותקנות גרסאות שונות של Java, חשוב וודא כי מהדר Java (ג'אוואק), משגר ה- Java (ג'אווה) והכלים הנ"ל (JFR, jcmd ו- JMC) הם מאותה הפצה של Java. אחרת, קיים סיכון שלא תוכל לראות נתונים שימושיים מכיוון שפורמטי הנתונים JFR בגרסאות שונות עשויים שלא להיות תואמים.

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

3.1. אירועים

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

יש שלושה סוגים של אירועים ש- JFR אוסף:

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

3.2. זרימת נתונים

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

JFR שומר נתונים על האירועים בקובץ פלט יחיד, flight.jfr.

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

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

במקרים נדירים, JFR עלול שלא לשטוף את הנתונים (למשל, כאשר ישנם יותר מדי אירועים או במקרה של הפסקת חשמל). אם זה קורה, JFR מנסה להודיע ​​לנו שקובץ הנתונים חסר אולי בקובץ הפלט.

4. כיצד להשתמש ב- Java Flight Recorder

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

כדי ש- JDK 8 יוכל להפעיל את JFR, עלינו להפעיל את ה- JVM עם האפשרויות + UnlockCommercialFeatures ו + FlightRecorder.

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

4.1. שורת פיקוד

ראשית, אנו מרכיבים את התוכניות *. ג'אווה התיק לתוך *.מעמד באמצעות מהדר Java הרגיל ג'אוואק.

לאחר שהידור יצליח, אנו עשויים להתחיל את התוכנית עם האפשרויות הבאות:

java -XX: + UnlockCommercialFeatures -XX: + FlightRecorder -XX: StartFlightRecording = משך = 200 שניות, שם קובץ = flight.jfr נתיב לקובץ מחלקה

איפה נתיב-לקבץ-קבצים היא נקודת הכניסה של היישום *.מעמד קוֹבֶץ.

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

4.2. כלי פקודת האבחון

אנו יכולים גם להתחיל לרשום את האירועים באמצעות jcmd כְּלִי. לדוגמה:

jcmd 1234 JFR. משך התחלה = 100s שם קובץ = flight.jfr

לפני JDK 11, על מנת שנוכל להפעיל את JFR בצורה זו, עלינו להתחיל את היישום בתכונות מסחריות נעולות:

java -XX: + UnlockCommercialFeatures -XX: + FlightRecorder -cp ./out/ com.baeldung.Main

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

jcmd [פרמטרים]

הנה רשימה מלאה של פקודות האבחון:

  • JFR.start - מתחיל הקלטת JFR חדשה
  • JFR. לבדוק - בודק הפעלת הקלטות JFR
  • עצור JFR - עוצר הקלטת JFR ספציפית
  • JFR. Dump - מעתיק תוכן של הקלטת JFR לקובץ

לכל פקודה יש ​​סדרה של פרמטרים. לדוגמא, ה JFR.start לפקודה יש ​​את הפרמטרים הבאים:

  • שֵׁם - שם ההקלטה; זה משמש כדי להיות מסוגל להתייחס להקלטה זו מאוחר יותר עם פקודות אחרות
  • לְעַכֵּב - פרמטר ממדי לעיכוב בזמן התחלת ההקלטה, ערך ברירת המחדל הוא 0 שניות
  • מֶשֶׁך - פרמטר ממדי לפרק זמן של משך ההקלטה; ערך ברירת המחדל הוא 0 שניות, כלומר ללא הגבלה
  • שם קובץ - שם הקובץ המכיל את הנתונים שנאספו
  • מקסימום - פרמטר ממדי לגיל המרבי של הנתונים שנאספו; ערך ברירת המחדל הוא 0 שניות, כלומר ללא הגבלה
  • גודל מקסימלי - הגודל המרבי של מאגרים עבור נתונים שנאספו בתים; ערך ברירת המחדל הוא 0, כלומר אין גודל מקסימלי

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

למרות ש- JFR נועד להיות בעל טביעת רגל קטנה ככל האפשר על הביצועים של ה- JVM והיישום, עדיף להגביל את הכמות המרבית של נתונים שנאספו על ידי הגדרת לפחות אחד מהפרמטרים: מֶשֶׁך, מקסימום, או גודל מקסימלי.

5. מקליט טיסה של ג'אווה בפעולה

בואו כעת נדגים את JFR בפעולה באמצעות תוכנית דוגמה.

5.1. תוכנית לדוגמא

התוכנית שלנו מכניסה אובייקטים לרשימה עד ל- OutOfMemoryError מתרחשת. ואז התוכנית ישנה לשנייה אחת:

ראשי סטטי ציבורי ריק (String [] args) {פריטי רשימה = ArrayList חדש (1); נסה {while (true) {items.add (אובייקט חדש ()); }} לתפוס (OutOfMemoryError e) {System.out.println (e.getMessage ()); } לטעון items.size ()> 0; נסה את {Thread.sleep (1000); } לתפוס (InterruptedException e) {System.out.println (e.getMessage ()); }}

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

5.2. התחל להירשם

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

javac -d out -sourcepath src / main src / main / com / baeldung / flightrecorder / FlightRecorder.java

בשלב זה, עלינו למצוא קובץ FlightRecorder.class בתוך ה out / com / baeldung / flightrecorder מַדרִיך.

כעת נתחיל את התוכנית עם האפשרויות הבאות:

java -XX: + UnlockCommercialFeatures -XX: + FlightRecorder -XX: StartFlightRecording = משך = 200 שניות, שם קובץ = flight.jfr -cp ./out/ com.baeldung.flightrecorder.FlightRecorder

5.3. דמיין נתונים

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

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

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

בלשונית זו אנו יכולים להבחין בחסרון נוסף של תוכנית הדוגמה שלנו: שיטה java.util.ArrayList.grow (int) נקרא 17 פעמים על מנת להגדיל את קיבולת המערך בכל פעם שלא היה מספיק מקום להוספת אובייקט.

בתוכניות מציאותיות יותר אנו עשויים לראות מידע רב שימושי אחר:

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

6. מסקנה

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

כמו תמיד, קטע הקוד זמין במאגר Github שלנו.


$config[zx-auto] not found$config[zx-overlay] not found