Προγραμματισμός

JDK 12: Οι νέες δυνατότητες στο Java 12

Η έκδοση παραγωγής του Java Development Kit 12, που βασίζεται στο Java SE (Standard Edition) 12, είναι τώρα διαθέσιμη. Οι εκδόσεις JDK 12 είναι διαθέσιμες από το Oracle για Linux, Windows και MacOS.

Πού να κατεβάσετε το JDK 12

Μπορείτε να κατεβάσετε το JDK 12 από τον ιστότοπο Java.net.

Οι εκδόσεις ανοιχτού κώδικα παρέχονται βάσει της άδειας GNU General Public License v2, με το Classpath Exception. Εμπορικές κατασκευές JDK 12 από την Oracle μπορούν να βρεθούν στο δίκτυο της Oracle Technology με άδεια μη ανοικτού κώδικα.

Νέες δυνατότητες στο Java 12

Συλλέκτης απορριμμάτων Shenandoah

Το Java 12 προσθέτει τον Shenandoah, έναν πειραματικό αλγόριθμο συλλογής απορριμμάτων, για να μειώσει τους χρόνους παύσης συλλογής απορριμμάτων εκτελώντας εργασίες εκκένωσης ταυτόχρονα με την εκτέλεση νημάτων Java. Το Shenandoah παρέχει έναν κατάλληλο αλγόριθμο για εφαρμογές που εκτιμούν την ανταπόκριση και τις προβλέψιμες σύντομες παύσεις. Ωστόσο, η πρόθεση δεν είναι να διορθώσετε όλα τα προβλήματα παύσης του JVM.

Το Red Hat υποστηρίζει επί του παρόντος το Shenandoah στις αρχιτεκτονικές Aarch64 και AMD64.

Αφαιρούμενες μικτές συλλογές για τον συλλέκτη απορριμμάτων G1

Η Java 12 κάνει τις μικτές συλλογές G1 να αφαιρούνται εάν ενδέχεται να υπερβούν τον στόχο παύσης. Ένας στόχος του G1 ήταν η επίτευξη ενός στόχου χρόνου παύσης που παρέχεται από τον χρήστη για τις παύσεις συλλογής του.

Προηγουμένως, μια μηχανή προηγμένης ανάλυσης επέλεξε το ποσό της εργασίας που πρέπει να γίνει κατά τη διάρκεια μιας συλλογής. Το αποτέλεσμα ήταν ένα σύνολο περιοχών γνωστών ως σύνολο συλλογής. Μόλις ορίστηκε το σετ και ξεκίνησε η συλλογή, το G1 συγκέντρωσε όλα τα ζωντανά αντικείμενα στις περιοχές των συλλογών σε όλες τις περιοχές χωρίς διακοπή. Αλλά αυτό θα μπορούσε να οδηγήσει στο G1 να ξεπεράσει τον στόχο του χρόνου παύσης, εάν η ευρετική μιας εφαρμογής επέλεξε ένα σύνολο συλλογών που ήταν πολύ μεγάλο.

Χρειάστηκε ένας μηχανισμός για την ανίχνευση πότε η ευρετική επέλεξε επανειλημμένα μια λανθασμένη ποσότητα εργασίας για συλλογές και, εάν συνέβη αυτό, το G1 εκτελεί εργασίες συλλογής σταδιακά σε βήματα, όπου η συλλογή θα μπορούσε να ακυρωθεί μετά από κάθε βήμα. Ο μηχανισμός που εισήχθη στην Java 12 επιτρέπει στο G1 να επιτυγχάνει συχνότερα τον στόχο χρόνου παύσης.

Γρήγορη επιστροφή της αχρησιμοποίητης δεσμευμένης μνήμης

Το Java 12 ενισχύει το G1 για να επιστρέφει αυτόματα τη μνήμη σωρού Java στο λειτουργικό σύστημα όταν είναι αδρανής. Αυτή η μνήμη απελευθερώνεται σε εύλογο χρονικό διάστημα όταν υπάρχει πολύ χαμηλή δραστηριότητα εφαρμογής.

Προηγουμένως, το G1 επέστρεψε μόνο τη μνήμη από το σωρό είτε σε μια πλήρη συλλογή απορριμμάτων είτε σε έναν ταυτόχρονο κύκλο. Με το G1 να προσπαθεί να αποφύγει την πλήρη συλλογή απορριμμάτων, ενεργοποιώντας μόνο έναν ταυτόχρονο κύκλο με βάση τη δραστηριότητα κατοχής και κατανομής σωρών, δεν θα επιστρέψει πολλές φορές τη μνήμη αν δεν αναγκαστεί να το κάνει εξωτερικά. Αυτή η συμπεριφορά ήταν δυσμενής σε περιβάλλοντα κοντέινερ όπου οι πόροι πληρώνονται με χρήση. Ακόμη και όταν το JVM χρησιμοποιεί μόνο ένα κλάσμα της εκχωρημένης μνήμης λόγω αδράνειας, το G1 διατήρησε τον πλήρη σωρό. Έτσι, οι πελάτες πλήρωναν όλη την ώρα τους πόρους και οι πάροχοι cloud δεν μπορούσαν να κάνουν πλήρη χρήση του υλικού τους.

Με το Java 12, το JVM μπορεί να ανιχνεύσει φάσεις υποαποχρησιμοποίησης σωρού και να μειώσει αυτόματα τη χρήση σωρού κατά τη διάρκεια αυτής της περιόδου.

API σταθερών JVM

Αυτό το API μοντελοποιεί ονομαστικές περιγραφές των αντικειμένων αρχείων κλειδιού και χρόνου εκτέλεσης, ιδιαίτερα σταθερές που μπορούν να φορτωθούν από τη σταθερή ομάδα. Η Java 12 ορίζει μια οικογένεια συμβολικών τύπων αναφοράς με βάση την αξία σε ένα νέο πακέτο, java.lang.invoke.constant, για να περιγράψετε κάθε είδος σταθερής φόρτωσης.

Υπάρχουν σταθερές ομάδες σε κάθε κλάση Java, αποθηκεύοντας τελεστές και οδηγίες bytecode στην τάξη. Οι καταχωρήσεις στη συνεχή συγκέντρωση περιγράφουν είτε τεχνάσματα χρόνου εκτέλεσης όπως τάξεις και μεθόδους είτε απλές τιμές όπως συμβολοσειρές και ακέραιους αριθμούς. Αυτές οι εγγραφές είναι γνωστές ως σταθερές με δυνατότητα φόρτωσης.

Τα προγράμματα που χειρίζονται αρχεία κλάσης πρέπει να μοντελοποιούν οδηγίες bytecode και με τη σειρά τους φορτώσιμες σταθερές. Ωστόσο, η χρήση τυπικών τύπων Java για τη μοντελοποίηση σταθερών φορτώσεων είναι ανεπαρκής. Αυτό μπορεί να είναι αποδεκτό για μια σταθερή με δυνατότητα φόρτωσης που περιγράφει μια συμβολοσειρά, αλλά είναι προβληματική για μια σταθερή με δυνατότητα φόρτωσης που περιγράφει μια κλάση, επειδή παράγει μια "ζωντανή" Τάξη Το αντικείμενο βασίζεται στην ορθότητα και τη συνέπεια της φόρτωσης της τάξης. Η φόρτωση κατηγορίας, ωστόσο, έχει πολλές περιβαλλοντικές εξαρτήσεις και τρόπους αστοχίας.

Έτσι, τα προγράμματα που ασχολούνται με τις φορτώσιμες σταθερές θα μπορούσαν να απλοποιηθούν εάν μπορούσαν να χειριστούν τάξεις και μεθόδους και λιγότερο γνωστά τεχνουργήματα, όπως λαβές μεθόδων και δυναμικά υπολογισμένες σταθερές σε ονομαστική, συμβολική μορφή. Έτσι, το API σταθερών JVM δίνει σε βιβλιοθήκες και εργαλεία έναν μοναδικό, τυπικό τρόπο για να περιγράψει σταθερές με δυνατότητα φόρτωσης.

Βελτιωμένη εκκίνηση, CDS και συλλογή απορριμμάτων

Η Java 12 βελτιώνει τη διαδικασία δημιουργίας JDK για να δημιουργήσει ένα αρχείο ανταλλαγής δεδομένων προεπιλεγμένης κλάσης (CDS), χρησιμοποιώντας την προεπιλεγμένη λίστα κλάσης, σε πλατφόρμες 64-bit. Αυτό βελτιώνει τον χρόνο εκκίνησης εκτός κουτιού και εξαλείφει την ανάγκη εκτέλεσης -Xshare: απόρριψη να επωφεληθείτε από το CDS. Η διαδικασία κατασκευής JDK έχει τροποποιηθεί για να εκτελεστεί java-xshare: απόρριψη μετά τη σύνδεση της εικόνας.

Πρόσθετες επιλογές γραμμής εντολών έχουν συμπεριληφθεί για να βελτιώσουν τους χρόνους συλλογής απορριμμάτων για να βελτιώσουν τη διάταξη μνήμης για κοινές περιπτώσεις. Οι χρήστες με πιο προηγμένες απαιτήσεις, όπως προσαρμοσμένες λίστες τάξεων που περιλαμβάνουν κλάσεις εφαρμογών και διαφορετικές διαμορφώσεις συλλογής απορριμμάτων, εξακολουθούν να έχουν τη δυνατότητα να δημιουργήσουν ένα προσαρμοσμένο αρχείο CDS.

Μειωμένος αριθμός θυρών ARM

Η Java 12 καταργεί όλες τις πηγές που σχετίζονται με το βραχίονα64 θύρα διατηρώντας ταυτόχρονα το 32-bit ARM και 64-bit ααρχ64. Η κατάργηση αυτής της θύρας θα επέτρεπε στους συντελεστές να επικεντρώσουν τις προσπάθειές τους σε μια ενιαία εφαρμογή ARM 64-bit και να εξαλείψουν διπλές εργασίες που θα προέκυπταν από τη συντήρηση δύο θυρών. Επί του παρόντος, δύο θύρες ARM 64-bit βρίσκονται στο JDK.

Εναλλαγή εκφράσεων

Η εναλλαγή εκφράσεων απλοποιεί την κωδικοποίηση επεκτείνοντας το διακόπτης δήλωση, ώστε να μπορεί να χρησιμοποιηθεί είτε ως δήλωση είτε ως έκφραση. Αυτό επιτρέπει τόσο στις δηλώσεις όσο και στις εκφράσεις να χρησιμοποιούν είτε «παραδοσιακή» είτε «απλοποιημένη» συμπεριφορά ελέγχου και ροής. Αυτές οι αλλαγές έχουν ως αποτέλεσμα απλούστερη «καθημερινή» κωδικοποίηση και προετοιμάζουν τον τρόπο για τη χρήση μοτίβου που ταιριάζει στο διακόπτης.

Καθώς οι κατασκευαστές Java κινούνται για να υποστηρίξουν την αντιστοίχιση μοτίβων, οι παρατυπίες της Javaδιακόπτης η δήλωση έχει γίνει εμπόδια. Αυτές περιλαμβάνουν την προεπιλεγμένη συμπεριφορά ροής ελέγχου των μπλοκ διακόπτη. προεπιλεγμένη κάλυψη των μπλοκ διακόπτη, στα οποία το μπλοκ αντιμετωπίζεται ως ένα μόνο πεδίο. και εναλλαγή που λειτουργεί μόνο ως δήλωση. Ο τρέχων σχεδιασμός των Java διακόπτης Η δήλωση ακολουθεί στενά τις γλώσσες όπως το C ++ και, από προεπιλογή, υποστηρίζει την εντυπωσιακή σημασιολογία. Αυτή η ροή ελέγχου ήταν χρήσιμη για τη σύνταξη κώδικα χαμηλού επιπέδου. Αλλά όταν ο διακόπτης χρησιμοποιείται σε περιβάλλοντα υψηλότερου επιπέδου, η φύση του με τάση σφάλματος αρχίζει να υπερτερεί της ευελιξίας.

Βασική σουίτα αναφοράς

Το JDK 12 περιλαμβάνει μια βασική σουίτα μικρο-σημάνσεων, τα οποία έχουν προστεθεί στον πηγαίο κώδικα της πλατφόρμας. Ο στόχος είναι να διευκολύνει τους προγραμματιστές να εκτελούν υπάρχοντα κριτήρια αξιολόγησης ή να δημιουργούν νέα.

Η πρόταση σουίτας microbenchmark, που δημιουργήθηκε τον Ιούλιο του 2014 και ενημερώθηκε στις αρχές Νοεμβρίου 2018, υποστηρίχθηκε από το Java Microbenchmark Harness (JMH), για τη δημιουργία σημείων αναφοράς γραμμένων σε Java και σε άλλες γλώσσες JVM. Η σουίτα συμπιέζεται με τον πηγαίο κώδικα JDK σε έναν μόνο κατάλογο, με προγραμματιστές που μπορούν να προσθέσουν εύκολα νέα σημεία αναφοράς.

Δεν ήταν στόχος η παροχή κριτηρίων αναφοράς για νέες δυνατότητες JDK ή η δημιουργία ενός πλήρους συνόλου κριτηρίων αναφοράς που καλύπτουν τα πάντα στο JDK. Σημειώστε επίσης ότι η σουίτα συγκριτικής αξιολόγησης δεν απαιτείται για κανονικές εκδόσεις JDK, αλλά αποτελεί ξεχωριστό στόχο κατασκευής.

Η πρόταση ζήτησε τη δημιουργία μιας νέας σελίδας στο wiki.openjdk.java.net για να εξηγήσει πώς να αναπτύξετε σημεία αναφοράς και να περιγράψετε τις απαιτήσεις. Αυτές οι απαιτήσεις θα απαιτήσουν την τήρηση προτύπων κωδικοποίησης, αναπαραγωγικής απόδοσης και τεκμηρίωσης.

Ενημερώσεις JDK 12

Τα σχέδια ζητούν από το JDK 12 να λαμβάνει δύο ενημερώσεις πριν από την επιτυχία του JDK 13 σε έξι μήνες. Το JDK 12 είναι μέρος του εξάμηνου ρυθμού κυκλοφορίας της Oracle που κυκλοφόρησε με το JDK 9 τον Σεπτέμβριο του 2017. Το JDK 12 χαρακτηρίζεται ως έκδοση χαρακτηριστικών, σε αντίθεση με το JDK 11, το οποίο είναι μια μακροπρόθεσμη έκδοση υποστήριξης με προγραμματισμένη υποστήριξη αρκετών ετών.