אספני אשפה של JVM

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

במדריך מהיר זה נציג את היסודות השונים אוסף הזבל של JVM (GC) יישומים. בנוסף, נגלה כיצד להפעיל סוג מסוים של איסוף זבל ביישומים שלנו.

2. מבוא קצר לאיסוף האשפה

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

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

  • סימן - זה המקום בו אספן הזבל מזהה אילו פיסות זיכרון נמצאים בשימוש ואילו לא
  • לטאטא - שלב זה מסיר אובייקטים שזוהו בשלב ה"סימון "

יתרונות:

  • אין הקצאה / טיפול זיכרון ידני בזיכרון מכיוון שמרחב הזיכרון שאינו בשימוש מטופל אוטומטית על ידי GC
  • אין תקורה של טיפול מצביע משתלשל
  • אוֹטוֹמָטִי דליפת זיכרון ניהול (GC בפני עצמו לא יכול להבטיח את פיתרון ההוכחה המלא לדליפת זיכרון, אולם הוא דואג לחלק טוב ממנו)

חסרונות:

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

3. יישומי GC

ל- JVM יש ארבעה סוגים של GC יישומים:

  • אספן אשפה סדרתי
  • אספן אשפה מקביל
  • אספן אשפה של CMS
  • אספן אשפה G1

3.1. אספן אשפה סדרתי

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

עם זאת, הייתה שיחה מצוינת מאת טוויטר מהנדסים ב- QCon 2012 על הביצועים של אספן אשפה סדרתי - שזו דרך טובה להבין טוב יותר את האספן הזה.

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

java -XX: + UseSerialGC -jar Application.java

3.2. אספן אשפה מקביל

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

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

ניתן לשלוט על מספר חוטי אספן האשפה באמצעות אפשרות שורת הפקודה -XX: ParallelGCThreads =.

יעד זמן ההשהיה המרבי (פער [באלפיות שנייה] בין שניים GC) מוגדרת באמצעות שורת הפקודה -XX: MaxGCPauseMillis =.

יעד התפוקה המרבי (נמדד ביחס למשך זמן איסוף האשפה לעומת הזמן שבילה מחוץ לאיסוף האשפה) מוגדר על ידי אפשרות שורת הפקודה -XX: GCTimeRatio =.

טביעת הרגל המקסימלית של הערימה (כמות זיכרון הערימה שהתוכנית דורשת בזמן הרצה) מוגדרת באמצעות האפשרות -Xmx.

כדי לאפשר אספן אשפה מקבילנוכל להשתמש בטיעון הבא:

java -XX: + UseParallelGC -jar Application.java

3.3. אספן אשפה של CMS

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

במילים פשוטות, יישומים המשתמשים ב- GC מסוג זה מגיבים לאט יותר בממוצע, אך אינם מפסיקים להגיב לביצוע איסוף אשפה.

נקודה מהירה שיש לציין כאן היא שמאז זה GC הוא במקביל, קריאה לאיסוף אשפה מפורש כגון שימוש System.gc () בעוד שהתהליך במקביל עובד, יביא כשל / הפרעה למצב בו זמנית.

אם יותר מ 98% מכלל הזמן מושקע ב CMS איסוף האשפה ופחות מ -2% מהערמה מתאוששת, ואז OutOfMemoryError נזרק על ידי CMSאַסְפָן. במידת הצורך, ניתן להשבית תכונה זו על ידי הוספת האפשרות -XX: -UseGCOverheadLimit לשורת הפקודה.

לאספן זה יש גם מצב הידוע כמצב מצטבר שמוצא משימוש ב- Java SE 8 וייתכן שהוא יוסר במהדורה מרכזית עתידית.

כדי לאפשר את אספן אשפה של CMS, אנו יכולים להשתמש בדגל הבא:

java -XX: + UseParNewGC -jar Application.java

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

>> java -XX: + אזהרת VM Server Server 64 סיביות: אפשרות UseConcMarkSweepGC הוצאה משימוש בגירסה 9.0 וככל הנראה תוסר במהדורה עתידית. גרסת Java "9.0.1"

יתר על כן, Java 14 הורידה לחלוטין את תמיכת CMS:

>> java -XX: + UseConcMarkSweepGC - גרסת OpenJDK 64-Bit Server אזהרה: התעלמות מאפשרת UseConcMarkSweepGC; התמיכה הוסרה ב- 14.0 openjdk 14 2020-03-17

3.4. אספן אשפה G1

G1 (אשפה ראשונה) אספן אשפה מיועד ליישומים הפועלים במכונות מרובות מעבדים עם שטח זיכרון גדול. זה זמין מאז עדכון JDK7 4 ובמהדורות מאוחרות יותר.

G1 אספן יחליף את CMS אספן מכיוון שהוא יעיל יותר בביצועים.

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

לאחר סיום שלב הסימון, G1 יודע אילו אזורים ריקים בעיקר. הוא אוסף בתחומים אלה תחילה, מה שמניב בדרך כלל שטח פנוי משמעותי (כלומר שלב 2 המכונה סוֹחֵף). זו הסיבה ששיטה זו לאיסוף אשפה נקראת Garbage-First.

כדי לאפשר את אספן אשפה G1נוכל להשתמש בטיעון הבא:

java -XX: + UseG1GC -jar Application.java

3.5. שינויים ב- Java 8

ג'אווה 8u20 הציג עוד אחד JVM פרמטר להפחתת השימוש המיותר בזיכרון על ידי יצירת יותר מדי מופעים של אותו חוּט. זה מייעל את זיכרון הערימה על ידי הסרת כפילויות חוּט ערכים לסינגל גלובלי לְהַשְׁחִיר[] מַעֲרָך.

ניתן להפעיל פרמטר זה על ידי הוספה -XX: + UseStringDeduplication כ JVM פָּרָמֶטֶר.

4. מסקנה

במדריך מהיר זה, הסתכלנו על השונה אוסף זבל של JVM יישומים ומקרי השימוש בהם.

תיעוד מפורט יותר ניתן למצוא כאן.


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