חקר דגלי כוונון JVM

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

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

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

2. סקירה של אפשרויות Java

ה ג'אווה הפקודה תומכת במגוון רחב של דגלים הנמצאים בקטגוריות הבאות:

  • אפשרויות סטנדרטיות המובטחות כי יתמכו בכל יישומי JVM הקיימים שם. בדרך כלל, אפשרויות אלה משמשות לפעולות יומיומיות כגון – Class path, -cp, –version, וכולי
  • אפשרויות נוספות שאינן נתמכות על ידי כל יישומי JVM ובדרך כלל כפופות לשינויים. אפשרויות אלה מתחילות ב -איקס

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

במהלך מאמר זה אנו מתמקדים במתקדמים יותר -XX דגלים.

3. דגלי כוונון JVM

כדי לרשום את דגלי הכוונון העולמיים של JVM, אנו יכולים לאפשר את PrintFlagsFinal דגל כדלקמן:

>> java -XX: + PrintFlagsFinal -version [דגלים גלובליים] uintx CodeCacheExpansionSize = 65536 {pd product} {default} bool CompactStrings = true {pd product} {default} bool DoEscapeAnalysis = true {C2 product} {default} כפול G1ConcMarkStepDurationMillis = 10.000000 {product} {default} size_t G1HeapRegionSize = 1048576 {product} {ergonomic} uintx MaxHeapFreeRatio = 70 {manageable} {default} // גרסת openjdk קטומה "14" 2020-03-17 OpenJDK Runtime Environment (build 14 + 36-1461 ) OpenJDK 64-bit Server VM (build 14 + 36-1461, מצב מעורב, שיתוף)

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

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

3.1. דגלי אבחון

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

>> java -XX: + PrintFlagsFinal -version | wc -l 557 >> java -XX: + PrintFlagsFinal -XX: + UnlockDiagnosticVMOptions -version | wc -l 728

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

bool PrintNMTStatistics = שקר {אבחון} {ברירת מחדל}

3.2. דגלים ניסיוניים

כדי לראות גם אפשרויות ניסיוניות, עלינו להוסיף את ה- בטל את הנעילה ExperimentalVMOptions דֶגֶל:

>> java -XX: + UnlockDiagnosticVMOptions -XX: + UnlockExperimentalVMOptions -XX: + PrintFlagsFinal -version | wc -l 809

3.3. דגלי JVMCI

נכון ל- Java 9, ממשק המהדר JVM או JVMCI מאפשרים לנו להשתמש במהדר שנכתב ב- Java, כמו Graal, כמהדר דינמי.

כדי לראות אפשרויות הקשורות ל- JVMCI, עלינו להוסיף עוד כמה דגלים ואף להפעיל את ה- JVMCI:

>> java -XX: + UnlockDiagnosticVMOptions -XX: + UnlockExperimentalVMOptions \ >> -XX: + JVMCIPrintProperties -XX: + EnableJVMCI -XX: + PrintFlagsFinal -version | wc -l 1516

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

3.4. לשים את הכל ביחד

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

>> כינוי jflags = "java -XX: + UnlockDiagnosticVMOptions -XX: + UnlockExperimentalVMOptions -XX: + PrintFlagsFinal -version" >> jflags | grep Soft size_t SoftMaxHeapSize = 4294967296 {לניהול} {ארגונומי} intx SoftRefLRUPolicyMSPerMB = 1000 {מוצר} {ברירת מחדל}

מהתוצאה אנו יכולים לנחש זאת בקלות SoftRefLRUPolicyMSPerMB הוא הדגל שאנחנו מחפשים.

4. סוגים שונים של דגלים

בחלק הקודם הגהנו נושא חשוב: סוגי הדגלים. בואו נסתכל שוב על ה- java -XX: + PrintFlagsFinal -version תְפוּקָה:

[דגלים גלובליים] uintx CodeCacheExpansionSize = 65536 {pd product} {default} bool CompactStrings = true {pd product} {default} bool DoEscapeAnalysis = true {C2 product} {default} כפול G1ConcMarkStepDurationMillis = 10.000000 {product} {default} size_t G1HeapRegion 1048576 {product} {ergonomic} uintx MaxHeapFreeRatio = 70 {manageable} {default} // קטום

כפי שמוצג לעיל, לכל דגל יש סוג מסוים.

אפשרויות בוליאניות משמשות להפעלה או השבתה של תכונה. אפשרויות כאלה אינן דורשות ערך. כדי לאפשר אותם, עלינו רק לשים סימן פלוס לפני שם האפשרות:

-XX: + PrintFlagsFinal

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

-XX: -RestrictContended

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

-XX: ObjectAlignmentInBytes = 16 -Xms5g -Xlog: gc

5. תיעוד וקוד מקור

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

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

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

לדוגמה, אנו יכולים לבדוק את קוד המקור של HotSpot JVM מ- GitHub או אפילו ממאגר Mercurial שלהם ואז:

>> שיבוט git [מוגן באמצעות דוא"ל]: openjdk / jdk14u.git openjdk >> cd openjdk / src / hotspot >> grep -FR 'PrintFlagsFinal'. ./share/runtime/globals.hpp: מוצר (bool, PrintFlagsFinal, false, ./share/runtime/init.cpp: if (PrintFlagsFinal || PrintFlagsRanges) {

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

6. מסקנה

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


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