JDK 12: התכונות החדשות ב- Java 12

מהדורת ההפקה של ערכת פיתוח Java 12, המבוססת על Java SE (מהדורה רגילה) 12, זמינה כעת. JDK 12 builds זמינים מ- Oracle עבור Linux, Windows ו- MacOS. 

היכן ניתן להוריד את JDK 12

אתה יכול להוריד את JDK 12 מאתר Java.net.

בניית קוד פתוח מסופקת תחת הרישיון הציבורי הכללי של GNU v2, עם חריג Classpath. מבנים מסחריים של JDK 12 מבית Oracle ניתן למצוא ברשת Oracle Technology תחת רישיון קוד פתוח.

תכונות חדשות ב- Java 12

אספן אשפה שננדואה

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

רד האט תומכת כיום בשננדואה בארכיטקטורות Aarch64 ו- AMD64.

אוספים מעורבים בוטלים לאוסף הזבל G1

Java 12 הופך אוספים מעורבים של G1 לביטול אם הם עשויים לחרוג מיעד ההשהיה. המטרה של G1 הייתה לעמוד ביעד זמן ההשהיה שסופק על ידי המשתמש בהפסקות האיסוף שלו.

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

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

חזרה מהירה של זיכרון מחויב שאינו בשימוש

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

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

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

ממשק API של קבצי JVM

ממשק API זה מעצב תיאורים נומינליים של חפצי קבצים ומחלקות זמן ריצה, במיוחד קבועים הניתנים לטעינה מהבריכה הקבועה. Java 12 מגדיר משפחה של סוגי התייחסות סמלים מבוססי-ערך בחבילה חדשה java.lang.invoke.constant, כדי לתאר כל סוג של קבוע הניתן לטעינה.

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

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

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

שיפור הפעלה, CDS ואיסוף אשפה

Java 12 משפר את תהליך הבנייה של JDK כדי ליצור ארכיב ברירת מחדל של שיתוף נתונים (CDS) בכיתה, באמצעות רשימת המחלקות המוגדרת כברירת מחדל, בפלטפורמות 64 סיביות. זה משפר את זמן ההפעלה מחוץ לקופסה ומבטל את הצורך לרוץ -Xshare:dumpכדי ליהנות מה- CDS. תהליך הבנייה של JDK השתנה להפעלה java-xshare:dumpלאחר קישור התמונה.

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

מספר יציאות ARM מופחת

Java 12 מסיר את כל המקורות הקשורים arm64ליציאה תוך שמירה על ARM של 32 סיביות ו- 64 סיביות aarch64. הסרת יציאה זו תאפשר לתורמים להתמקד במאמצים ביישום ARM יחיד של 64 סיביות ולמנוע עבודות כפולות הנובעות משמירה על שתי יציאות. נכון לעכשיו, שתי יציאות ARM של 64 סיביות נמצאות ב- JDK.

החלף ביטוי

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

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

סוויטת אמת מידה בסיסית

JDK 12 כולל חבילה בסיסית של סימני מיקרו-בנצ'ים, שנוספו לקוד המקור של הפלטפורמה. המטרה היא להקל על מפתחים להריץ מידות קיימות או לבנות חדשים.

ההצעה לחבילת microbenchmarks, שנוצרה ביולי 2014 ועודכנה בתחילת נובמבר 2018, הונחתה על ידי הרתמה של Java Microbenchmark (JMH), לבניית אמות מידה שנכתבו בג'אווה ובשפות JVM אחרות. הסוויטה משולבת בקוד המקור של JDK בספריה יחידה, כאשר מפתחים יכולים להוסיף מידות חדשות בקלות.

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

ההצעה קראה ליצור דף חדש ב- wiki.openjdk.java.net כדי להסביר כיצד לפתח אמות מידה ולתאר דרישות. דרישות אלה יחייבו עמידה בתקני קידוד, ביצועים הניתנים לשחזור ותיעוד.

עדכוני JDK 12

התוכניות קוראות ל- JDK 12 לקבל שני עדכונים לפני שיחליפו את JDK 13 בעוד חצי שנה. JDK 12 הוא חלק ממדרגת השחרור של אורקל בת שישה חודשים שהוצגה עם JDK 9 בספטמבר 2017. JDK 12 מאופיין כשחרור תכונות, בניגוד ל- JDK 11, המהווה מהדורת תמיכה ארוכת טווח עם תכנון של מספר שנים של תמיכה.