לכידת אשכול ג'אווה של Java

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

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

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

בחלקים הבאים נעבור על כלים וגישות מרובים ליצירת dump thread.

2. שימוש ב- JDK Utilities

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

2.1. ערימה

jstack הוא כלי JDK בשורת הפקודה שבו אנו יכולים להשתמש כדי ללכוד dump אשכול. זה לוקח את pid של תהליך ומציג את זריקת החוט במסוף. לחלופין, אנו יכולים להפנות את הפלט לקובץ.

בואו נסתכל על תחביר הפקודה הבסיסי ללכידת dump אשכול באמצעות jstack:

jstack [-F] [-l] [-m] 

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

  • -F אפשרות מאלצת זריקת חוט; שימושי לשימוש כאשר jstack pid לא מגיב (התהליך נתלה)
  • -l אפשרות מורה לכלי השירות לחפש סינכרוניזציה הניתנים לבעלות בערימה ובמנעולים
  • אפשרות m מדפיס מסגרות מחסנית מקוריות (C & C ++) בנוסף למסגרות מחסנית Java

בואו נשתמש בידע הזה על ידי לכידת אשכול אשכול והפניית התוצאה לקובץ:

jstack 17264> /tmp/threaddump.txt

זכור שאנחנו יכולים להשיג בקלות את pid של תהליך Java באמצעות jps פקודה.

2.2. בקרת משימות ג'אווה

Java Mission Control (JMC) הוא כלי GUI שאוסף ומנתח נתונים מיישומי Java. לאחר הפעלת JMC, הוא מציג את רשימת תהליכי Java הפועלים במחשב מקומי. אנו יכולים להתחבר לתהליכי ג'אווה מרוחקים באמצעות JMC.

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

2.3. jvisualvm

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

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

נכון ל- JDK 9, Visual VM אינו נכלל בהפצות Oracle JDK ו- Open JDK. לכן, אם אנו משתמשים בג'אווה 9 או בגרסאות חדשות יותר, אנו יכולים להשיג את JVisualVM מאתר פרויקט קוד פתוח של Visual VM.

2.4. jcmd

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

אחת הפקודות הרבות שלה היא Thread.print. אנחנו יכולים להשתמש בו כדי להשיג זריקת חוט רק על ידי ציון ה- pid של התהליך:

jcmd 17264 Thread.print

2.5. jconsole

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

2.6. סיכום

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

  • ערימה: מספק את הדרך המהירה והקלה ביותר לתפוס זריקת חוט. עם זאת, חלופות טובות יותר זמינות החל מ- Java 8
  • jmc: כלי פרופיל ואבחון משופרים של JDK. זה ממזער את תקורת הביצועים שבדרך כלל בעיה עם כלי פרופיל
  • jvisualvm: כלי פרופיל קל ומקור פתוח עם קונסולת GUI מעולה
  • jcmd: חזק מאוד ומומלץ עבור Java 8 ואילך. כלי יחיד המשרת מטרות רבות - לכידת זריקת חוטים (ערימה), מזבלה ערימה (jmap), מאפייני מערכת וטיעונים בשורת הפקודה (jinfo)
  • jconsole: בואו נבדוק מידע אחר עקבות חוטים

3. משורת הפקודה

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

3.1. לַהֲרוֹג -3 פיקוד (לינוקס / יוניקס)

הדרך הקלה ביותר לתפוס זריקת חוט במערכות דומות ליוניקס היא באמצעות לַהֲרוֹג הפקודה, בה אנו יכולים להשתמש כדי לשלוח אות לתהליך באמצעות ה- לַהֲרוֹג() שיחת מערכת. במקרה שימוש זה, נשלח אליו את ה- -3 אוֹת.

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

להרוג -3 17264

בדרך זו תהליך ה- Java המקבל אות ידפיס את זריקת החוט על הפלט הסטנדרטי.

אם נפעיל את תהליך Java עם השילוב הבא של כוונון דגלים, הוא גם ינתב את זריקת החוט לקובץ הנתון:

-XX: + UnlockDiagnosticVMOptions -XX: + LogVMOutput -XX: LogFile = ~ / jvm.log

עכשיו אם אנו שולחים את -3 בנוסף, לפלט הסטנדרטי, המזבלה תהיה זמינה ב ~ / jvm.log קוֹבֶץ.

3.2. Ctrl + הפסקה (Windows)

במערכות הפעלה של Windows, אנו יכולים ללכוד זריקת חוט באמצעות CTRL ו לשבור שילוב מקשים. כדי לבצע זריקת אשכולות, נווט אל המסוף המשמש להפעלת יישום Java ולחץ CTRL ו לשבור מקשים יחד.

ראוי לציין כי בחלק מהמקלדות, ה- לשבור המפתח אינו זמין. לכן, במקרים כאלה, ניתן לתפוס זריקת חוט באמצעות CTRL, מִשׁמֶרֶת, ו הַפסָקָה מקשים יחד.

שתי הפקודות הללו מדפיסות את זריקת החוט למסוף.

4. באמצעות תכנות ThreadMxBean

הגישה האחרונה בה נדון במאמר היא שימוש ב- JMX. נשתמש ThreadMxBean כדי לתפוס את זריקת החוט. בואו נראה את זה בקוד:

פרטי סטטי מחרוזת threadDump (בוליאני נעולמוניטורים, בוליאני נעילהסינכרוניזרים) {StringBuffer threadDump = StringBuffer חדש (System.lineSeparator ()); ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean (); עבור (ThreadInfo threadInfo: threadMXBean.dumpAllThreads (lockedMonitors, lockedSynchronizers)) {threadDump.append (threadInfo.toString ()); } להחזיר threadDump.toString (); }

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

  1. בהתחלה, ריק StringBuffer מאותחל לאחסון מידע הערימה של כל שרשור.
  2. לאחר מכן אנו משתמשים ב- ניהול מפעל בכיתה כדי לקבל את המקרה של ThreadMxBean. א ניהול מפעל הוא חוג מפעל להשגת שעועית מנוהלת לפלטפורמת Java. בנוסף, א ThreadMxBean הוא ממשק הניהול של מערכת ההברגה של ה- JVM.
  3. הגדרה נעילת מוניטורים ו נעילהסינכרוניזרים ערכים ל נָכוֹן מציין לתפוס את הסנכרוניזציה הניתנים לבעלות ואת כל המוניטורים הנעולים במזרן החוט.

5. מסקנה

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

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

כמו תמיד, קוד המקור המלא של הדוגמה זמין ב- GitHub.


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