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

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

Το Java Development Kit (JDK) 16 έχει φτάσει στην αρχική του φάση βελτίωσης, πράγμα που σημαίνει ότι το σύνολο λειτουργιών έχει πλέον παγώσει, από τις 10 Δεκεμβρίου 2020. Τα νέα χαρακτηριστικά στο JDK 16 κυμαίνονται από μια δεύτερη προεπισκόπηση σφραγισμένων τάξεων έως ταίριασμα μοτίβων έως ταυτόχρονο νήμα- επεξεργασία στοίβας για συλλογή απορριμμάτων.

Το JDK 16 θα είναι η εφαρμογή αναφοράς της έκδοσης του τυπικού Java που θα ακολουθήσει το JDK 15, το οποίο έφτασε στις 15 Σεπτεμβρίου. Ένα προτεινόμενο πρόγραμμα κυκλοφορίας έχει το JDK 16 να φτάσει σε μια δεύτερη φάση rampdown στις 14 Ιανουαρίου 2021, ακολουθούμενο από υποψηφίους κυκλοφορίας που θα φτάσουν στις 4 Φεβρουαρίου και 18 Φεβρουαρίου 2021. Η κυκλοφορία της παραγωγής πρόκειται να δημοσιευθεί στις 16 Μαρτίου 2021.

Δεκαεπτά προτάσεις στοχεύουν επίσημα το JDK 16 στις 10 Δεκεμβρίου 2020. Οι νέες δυνατότητες που έρχονται στο Java 16 περιλαμβάνουν:

  • Η προειδοποίηση για πρόταση κατηγοριών βάσει αξίας ορίζει τις αρχικές κατηγορίες περιτυλίγματος ως βασισμένες στην αξία και καταργεί τους κατασκευαστές τους για αφαίρεση, προκαλώντας νέες προειδοποιήσεις κατάργησης. Παρέχονται προειδοποιήσεις για ακατάλληλες προσπάθειες συγχρονισμού σε περιπτώσεις οποιωνδήποτε κλάσεων που βασίζονται σε αξία στην πλατφόρμα Java. Οδήγηση αυτής της προσπάθειας είναι το έργο Valhalla, το οποίο επιδιώκει μια σημαντική βελτίωση στο μοντέλο προγραμματισμού Java με τη μορφή πρωτόγονων τάξεων. Οι πρωτόγονες τάξεις δηλώνουν τις παρουσίες χωρίς ταυτότητα και ικανές για ενσωματωμένες ή ισοπεδωμένες αναπαραστάσεις, όπου οι παρουσίες μπορούν να αντιγραφούν ελεύθερα μεταξύ τοποθεσιών μνήμης και κωδικοποιημένων χρησιμοποιώντας τιμές των πεδίων των παρουσιών. Ο σχεδιασμός και η εφαρμογή των αρχικών τάξεων στη Java είναι πλέον αρκετά ώριμη ώστε η μετεγκατάσταση ορισμένων κλάσεων της πλατφόρμας Java σε πρωτόγονες τάξεις να αναμένεται σε μια μελλοντική έκδοση. Οι υποψήφιοι για μετανάστευση ορίζονται ανεπίσημα ως κλάσεις βάσει αξίας στις προδιαγραφές API.
  • Προηγούμενη προεπισκόπηση στο JDK 15, οι κλειστές τάξεις και οι διεπαφές περιορίζουν ποιες άλλες κατηγορίες και διεπαφές μπορούν να επεκτείνουν ή να τις εφαρμόσουν. Οι στόχοι του προγράμματος περιλαμβάνουν τη δυνατότητα στον συγγραφέα μιας τάξης ή μιας διεπαφής να ελέγχει τον κώδικα που είναι υπεύθυνος για την εφαρμογή του, να παρέχει έναν πιο δηλωτικό τρόπο από τους τροποποιητές πρόσβασης για τον περιορισμό της χρήσης ενός superclass και να υποστηρίζει μελλοντικές οδηγίες στην αντιστοίχιση προτύπων παρέχοντας ένα θεμέλιο για ανάλυση των προτύπων.
  • Ισχυρή ενθυλάκωση εσωτερικών JDK από προεπιλογή, εκτός από κρίσιμα εσωτερικά API όπως misc. Μη ασφαλές. Οι χρήστες μπορούν να επιλέξουν την χαλαρή ισχυρή ενθυλάκωση που ήταν η προεπιλογή από το JDK 9. Οι στόχοι αυτής της πρότασης περιλαμβάνουν τη βελτίωση της ασφάλειας και της συντηρησιμότητας του JDK, ως μέρος του Project Jigsaw, και την ενθάρρυνση των προγραμματιστών να μεταναστεύσουν από τη χρήση εσωτερικών στοιχείων στη χρήση τυπικών API έτσι που τόσο οι προγραμματιστές όσο και οι τελικοί χρήστες μπορούν να ενημερώνονται εύκολα σε μελλοντικές εκδόσεις Java. Αυτή η πρόταση ενέχει τον πρωταρχικό κίνδυνο ότι ο υπάρχων κώδικας Java δεν θα εκτελεστεί. Οι προγραμματιστές ενθαρρύνονται να χρησιμοποιούν το εργαλείο jdeps για να προσδιορίσουν κώδικα που εξαρτάται από εσωτερικά στοιχεία του JDK και να στραφούν σε τυπικές αντικαταστάσεις όταν είναι διαθέσιμοι. Οι προγραμματιστές μπορούν να χρησιμοποιήσουν μια υπάρχουσα έκδοση, όπως το JDK 11, για να δοκιμάσουν τον υπάρχοντα κώδικα χρησιμοποιώντας--illegal-access = προειδοποίηση για να εντοπίσετε εσωτερικά στοιχεία στα οποία έχετε πρόσβαση μέσω αντανάκλασης, χρησιμοποιώντας--illegal-access = εντοπισμός σφαλμάτων για να εντοπίσετε τον κωδικό σφάλματος και δοκιμή με --illegal-access = άρνηση.
  • Ξένο API σύνδεσης, που προσφέρει στατική πληκτρολόγηση, καθαρή Java πρόσβαση σε εγγενή κώδικα. Αυτό το API θα βρίσκεται σε στάδιο επώασης στο JDK 16. Μαζί με το προτεινόμενο API πρόσβασης ξένης μνήμης, το API συνδέσμου ξένων συνδέσεων θα απλοποιήσει σημαντικά την κατά τα άλλα επιρρεπής σε σφάλματα διαδικασία σύνδεσης σε μια εγγενή βιβλιοθήκη. Αυτό το σχέδιο προορίζεται να αντικαταστήσει το JNI (Java Native Interface) με ένα ανώτερο μοντέλο ανάπτυξης καθαρού Java, για να προσφέρει υποστήριξη C και, με την πάροδο του χρόνου, να είναι αρκετά ευέλικτη για να φιλοξενήσει υποστήριξη για άλλες πλατφόρμες, όπως 32-bit x86 και ξένες συναρτήσεις γραμμένες σε άλλες γλώσσες εκτός C, όπως C ++. Η απόδοση πρέπει να είναι καλύτερη ή συγκρίσιμη με την JNI.
  • Μετακίνηση της επεξεργασίας στοίβας νήματος ZGC (Z Garbage Collector) από σημεία ασφαλείας σε ταυτόχρονη φάση. Οι στόχοι αυτού του σχεδίου περιλαμβάνουν την κατάργηση της επεξεργασίας στοίβας νήματος από τα σημεία ασφαλείας ZGC. καθιστώντας την επεξεργασία στοίβας τεμπέλης, συνεργατική, ταυτόχρονη και σταδιακή. αφαίρεση όλων των άλλων επεξεργασιών ρίζας ανά νήμα από τα σημεία ασφαλείας ZGC. και παρέχοντας έναν μηχανισμό για άλλα υποσυστήματα HotSpot VM για να επεξεργάζονται τεμπέλης στοίβες. Το ZGC έχει σκοπό να κάνει τις παύσεις GC και τα ζητήματα κλιμάκωσης στο HotSpot να είναι παρελθόν. Μέχρι στιγμής, οι λειτουργίες GC που κλιμακώνονται με το μέγεθος του σωρού και το μέγεθος του metaspace έχουν μετακινηθεί από τις λειτουργίες ασφαλούς σημείου και σε ταυτόχρονες φάσεις. Σε αυτά περιλαμβάνονται η σήμανση, η μετεγκατάσταση, η επεξεργασία αναφοράς, η εκφόρτωση τάξης και η περισσότερη επεξεργασία root. Οι μόνες δραστηριότητες που εξακολουθούν να γίνονται στα σημεία ασφαλείας του GC είναι ένα υποσύνολο επεξεργασίας ρίζας και μια λειτουργία τερματισμού σήμανσης με χρονικό περιορισμό. Αυτές οι ρίζες έχουν συμπεριλάβει στοίβες νημάτων Java και άλλες ρίζες νημάτων, με αυτές τις ρίζες να είναι προβληματικές επειδή κλιμακώνονται με τον αριθμό νημάτων. Για να προχωρήσετε πέρα ​​από την τρέχουσα κατάσταση, η επεξεργασία ανά νήμα, συμπεριλαμβανομένης της σάρωσης στοίβας, πρέπει να μετακινηθεί σε ταυτόχρονη φάση. Με αυτό το σχέδιο, το κόστος απόδοσης του βελτιωμένου λανθάνοντος χρόνου πρέπει να είναι ασήμαντο και ο χρόνος που αφιερώνεται στα σημεία ασφαλείας ZGC σε τυπικά μηχανήματα θα πρέπει να είναι μικρότερο από ένα χιλιοστό του δευτερολέπτου.
  • Μια ελαστική ικανότητα metaspace, η οποία επιστρέφει ταχύτερα στη μνήμη τα μεταδεδομένα κατηγορίας HotSpot VM (metaspace) στο λειτουργικό σύστημα, μειώνει το αποτύπωμα metaspace και απλοποιεί τον κώδικα metaspace για τη μείωση του κόστους συντήρησης. Το Metaspace αντιμετώπισε προβλήματα με τη χρήση υψηλής μνήμης εκτός σωρού. Το σχέδιο απαιτεί την αντικατάσταση του υπάρχοντος κατανεμητή μνήμης με ένα σχήμα κατανομής βασισμένο σε φίλους, παρέχοντας έναν αλγόριθμο για τη διαίρεση της μνήμης σε διαμερίσματα για την ικανοποίηση αιτημάτων μνήμης. Αυτή η προσέγγιση έχει χρησιμοποιηθεί σε μέρη όπως ο πυρήνας του Linux και θα καταστήσει πρακτική την εκχώρηση μνήμης σε μικρότερα κομμάτια για τη μείωση της επιβάρυνσης του φορτωτή κλάσης. Ο κατακερματισμός θα μειωθεί επίσης. Επιπλέον, η δέσμευση της μνήμης από το λειτουργικό σύστημα στους χώρους διαχείρισης μνήμης θα γίνει τεμπέλης, κατόπιν αιτήματος, για τη μείωση του αποτυπώματος για φορτωτές που ξεκινούν με μεγάλες αρένες, αλλά δεν τα χρησιμοποιούν αμέσως ή ενδέχεται να μην τα χρησιμοποιήσουν στο μέγιστο. Για να εκμεταλλευτείτε πλήρως την ελαστικότητα που προσφέρει η κατανομή φίλων, η μνήμη metaspace θα τοποθετηθεί σε κόκκους ομοιόμορφου μεγέθους που μπορούν να δεσμευτούν και να δεσμευτούν ανεξάρτητα το ένα από το άλλο.
  • Ενεργοποίηση λειτουργιών γλώσσας C ++ 14, για να επιτρέπεται η χρήση δυνατοτήτων C ++ 14 στον πηγαίο κώδικα JDK C ++ και να δοθεί συγκεκριμένη καθοδήγηση σχετικά με το ποια από αυτές τις δυνατότητες μπορεί να χρησιμοποιηθεί στον κώδικα HotSpot VM. Μέσω του JDK 15, οι λειτουργίες γλώσσας που χρησιμοποιούνται από τον κώδικα C ++ στο JDK έχουν περιοριστεί στα πρότυπα γλώσσας C ++ 98/03. Με το JDK 11, ο πηγαίος κώδικας ενημερώθηκε για να υποστηρίξει την κατασκευή με νεότερες εκδόσεις του προτύπου C ++. Αυτό περιλαμβάνει τη δυνατότητα δημιουργίας με πρόσφατες εκδόσεις μεταγλωττιστών που υποστηρίζουν λειτουργίες γλώσσας C ++ 11/14. Αυτή η πρόταση δεν προτείνει αλλαγές στυλ ή χρήσης για τον κώδικα C ++ που χρησιμοποιείται εκτός του HotSpot. Αλλά για να επωφεληθείτε από τις δυνατότητες γλώσσας C ++, απαιτούνται ορισμένες αλλαγές στο χρόνο κατασκευής, ανάλογα με τον μεταγλωττιστή πλατφόρμας.
  • Ένα διανυσματικό API σε ένα στάδιο επωαστήρα, στο οποίο το JDK θα εφοδιαζόταν με μια μονάδα εκκολαπτηρίου, jdk.incubator.vector, για την έκφραση υπολογιστικών διανυσμάτων που συγκεντρώνουν βέλτιστες οδηγίες υλικού φορέα σε υποστηριζόμενες αρχιτεκτονικές CPU, για επίτευξη ανώτερης απόδοσης με ισοδύναμους κλιματικούς υπολογισμούς. Το διανυσματικό API παρέχει έναν μηχανισμό για τη σύνταξη πολύπλοκων αλγορίθμων διανυσμάτων στην Java, χρησιμοποιώντας προϋπάρχουσα υποστήριξη στο HotSpot VM για διανύσματα, αλλά με ένα μοντέλο χρήστη που καθιστά τον διανυσματικό σχεδιασμό πιο προβλέψιμο και ισχυρό. Οι στόχοι της πρότασης περιλαμβάνουν την παροχή ενός σαφούς και περιεκτικού API για την έκφραση μιας σειράς υπολογιστικών διανυσμάτων, ως πλατφόρμα-αγνωστικός υποστηρίζοντας πολλαπλές αρχιτεκτονικές CPU και προσφέροντας αξιόπιστη συλλογή και απόδοση χρόνου εκτέλεσης σε αρχιτεκτονικές x64 και AArch64. Η χαριτωμένη υποβάθμιση είναι επίσης ένας στόχος, στον οποίο ένας υπολογισμός διανύσματος θα υποβαθμίστηκε με χαρά και θα λειτουργούσε εάν δεν μπορεί να εκφραστεί πλήρως κατά το χρόνο εκτέλεσης ως ακολουθία οδηγιών φορέα υλικού, είτε επειδή μια αρχιτεκτονική δεν υποστηρίζει ορισμένες οδηγίες είτε δεν υποστηρίζεται άλλη αρχιτεκτονική CPU .
  • Μεταφορά του JDK στην πλατφόρμα Windows / AArch64. Με την κυκλοφορία νέου υλικού κλάσης διακομιστή και καταναλωτή AArch64 (ARM64), τα Windows / AArch64 έχουν γίνει μια σημαντική πλατφόρμα λόγω της ζήτησης. Ενώ η ίδια η μεταφορά έχει ήδη ολοκληρωθεί ως επί το πλείστον, το επίκεντρο αυτής της πρότασης περιλαμβάνει την ενσωμάτωση της θύρας στο κεντρικό αποθετήριο JDK.
  • Μεταφορά του JDK σε Alpine Linux και σε άλλες διανομές Linux που χρησιμοποιούν το musl ως την κύρια βιβλιοθήκη C, σε αρχιτεκτονικές x64 και AArch64. Το Musl είναι μια εφαρμογή Linux της τυπικής λειτουργικότητας της βιβλιοθήκης που περιγράφεται στα πρότυπα ISO C και Posix. Το Alpine Linux υιοθετείται ευρέως σε εφαρμογές cloud, microservices και περιβάλλοντα κοντέινερ λόγω του μικρού μεγέθους της εικόνας. Μια εικόνα Docker για Linux είναι μικρότερη από 6MB. Το να αφήσετε την Java να τρέξει εκτός συσκευασίας σε τέτοιες ρυθμίσεις θα επιτρέψει στους Tomcat, Jetty, Spring και άλλα δημοφιλή πλαίσια να λειτουργούν εγγενώς σε αυτά τα περιβάλλοντα. Χρησιμοποιώντας το jlink για να μειώσει το μέγεθος του χρόνου εκτέλεσης Java, ένας χρήστης μπορεί να δημιουργήσει μια ακόμη μικρότερη εικόνα προσαρμοσμένη για την εκτέλεση μιας συγκεκριμένης εφαρμογής.
  • Παροχή τάξεων εγγραφών που ενεργούν ως διαφανείς φορείς για αμετάβλητα δεδομένα. Οι εγγραφές μπορούν να θεωρηθούν ονομαστικές πλειάδες. Η εγγραφή πραγματοποιήθηκε σε προεπισκόπηση στα JDK 14 και JDK 15. Αυτή η προσπάθεια ανταποκρίνεται σε παράπονα ότι η Java ήταν πολύ λεκτική ή ότι είχε τελετή. Οι στόχοι του σχεδίου περιλαμβάνουν τη σχεδίαση αντικειμενοστρεφούς κατασκεύασματος που εκφράζει μια απλή συγκέντρωση τιμών, βοηθώντας τους προγραμματιστές να επικεντρωθούν στη μοντελοποίηση αμετάβλητων δεδομένων παρά στην επεκτάσιμη συμπεριφορά, την αυτόματη εφαρμογή μεθόδων βάσει δεδομένων όπως ισούται και αξεσουάρ, και τη διατήρηση μακροχρόνιων αρχών Java, όπως ονομαστική πληκτρολόγηση.
  • Η προσθήκη καναλιών υποδοχής τομέα Unix, στα οποία προστίθεται υποστήριξη υποδοχής Unix-domain (AF_UNIX) στο API καναλιών υποδοχής καναλιού και διακομιστή υποδοχής στο πακέτο nio.channels. Το σχέδιο επεκτείνει επίσης τον κληρονομικό μηχανισμό καναλιών για την υποστήριξη καναλιών υποδοχής τομέα Unix και καναλιών υποδοχής διακομιστή. Οι υποδοχές Unix-domain χρησιμοποιούνται για επικοινωνίες μεταξύ διεργασιών στον ίδιο κεντρικό υπολογιστή. Είναι παρόμοια με τις υποδοχές TCP / IP από τις περισσότερες απόψεις, εκτός από το ότι αντιμετωπίζονται από ονόματα διαδρομών συστήματος αρχείων και όχι από διευθύνσεις IP και αριθμούς θύρας. Ο στόχος της νέας δυνατότητας είναι να υποστηρίζει όλες τις δυνατότητες των καναλιών υποδοχής τομέα Unix που είναι κοινές σε μεγάλες πλατφόρμες Unix και Windows. Τα κανάλια υποδοχής Unix-domain θα συμπεριφέρονται τα ίδια με τα υπάρχοντα κανάλια TCP / IP όσον αφορά τη συμπεριφορά ανάγνωσης / εγγραφής, τη ρύθμιση σύνδεσης, την αποδοχή εισερχόμενων συνδέσεων από διακομιστές και την πολυπλεξία με άλλα επιλέξιμα κανάλια που δεν αποκλείουν έναν επιλογέα. Οι υποδοχές Unix-domain είναι πιο ασφαλείς και πιο αποτελεσματικές από τις συνδέσεις loopback TCP / IP για τοπικές επικοινωνίες μεταξύ διεργασιών.
  • Ένα API πρόσβασης σε ξένη μνήμη, που επιτρέπει στα προγράμματα Java να έχουν ασφαλή πρόσβαση σε ξένη μνήμη εκτός του σωρού Java Παλαιότερα επωάστηκε τόσο στο JDK 14 όσο και στο JDK 15, το API πρόσβασης ξένης μνήμης θα επωάστηκε εκ νέου στο JDK 16, προσθέτοντας βελτιώσεις. Έχουν γίνει αλλαγές, συμπεριλαμβανομένου ενός σαφέστερου διαχωρισμού ρόλων μεταξύ του Τμήμα μνήμης και Μνήμη Διευθύνσεις διεπαφές. Στόχοι αυτής της πρότασης περιλαμβάνουν την παροχή ενός μοναδικού API για λειτουργία σε διάφορα είδη ξένης μνήμης, συμπεριλαμβανομένης της εγγενής, μόνιμης και διαχειριζόμενης σωρού μνήμης. Το API δεν πρέπει να υπονομεύει την ασφάλεια του JVM. Το κίνητρο της πρότασης είναι ότι πολλά προγράμματα Java έχουν πρόσβαση σε ξένη μνήμη, όπως Ignite, Memcached και MapDB. Ωστόσο, το Java API δεν παρέχει ικανοποιητική λύση για πρόσβαση σε ξένη μνήμη.
  • Ταίριασμα μοτίβου για το παράδειγμα τελεστής, ο οποίος επίσης προεπισκόπησε τόσο στο JDK 14 όσο και στο JDK 15. Θα οριστικοποιηθεί στο JDK 16. Η αντιστοίχιση μοτίβων επιτρέπει την κοινή λογική σε ένα πρόγραμμα, δηλαδή την υπό όρους εξαγωγή στοιχείων από αντικείμενα, να εκφράζεται πιο συνοπτικά και με ασφάλεια.
  • Παροχή του εργαλείου jpackage για τη συσκευασία αυτόνομων εφαρμογών Java. Παρουσιάστηκε ως εργαλείο επώασης στο JDK 14, το jpackage παρέμεινε σε επώαση στο JDK 15. Με το JDK 16, το jpackage μετακινείται στην παραγωγή, υποστηρίζοντας εγγενείς μορφές πακέτων για να δώσει στους χρήστες μια φυσική εμπειρία εγκατάστασης και να επιτρέπουν τον καθορισμό των παραμέτρων χρόνου έναρξης κατά το χρόνο συσκευασίας. Οι μορφές περιλαμβάνουν msi και exe σε Windows, pkg και dmg σε MacOS και deb και rpm σε Linux. Το εργαλείο μπορεί να κληθεί απευθείας από τη γραμμή εντολών ή μέσω προγραμματισμού. Το νέο εργαλείο συσκευασίας αντιμετωπίζει μια κατάσταση στην οποία πολλές εφαρμογές Java πρέπει να εγκατασταθούν σε εγγενείς πλατφόρμες με τρόπο πρώτης κατηγορίας, αντί να τοποθετηθούν στη διαδρομή κλάσης ή στη διαδρομή μονάδας. Απαιτείται ένα πακέτο με δυνατότητα εγκατάστασης κατάλληλο για την εγγενή πλατφόρμα.
  • Μετεγκατάσταση αποθετηρίων πηγαίου κώδικα OpenJDK από το Mercurial στο Git. Η επίτευξη αυτής της προσπάθειας είναι πλεονεκτήματα στο μέγεθος μεταδεδομένων του συστήματος ελέγχου εκδόσεων και στα διαθέσιμα εργαλεία και φιλοξενία.
  • Μετεγκατάσταση στο GitHub, που σχετίζεται με τη μετεγκατάσταση Mercurial-to-Git, με τα αποθετήρια πηγαίου κώδικα JDK 16 να βρίσκονται στον δημοφιλή ιστότοπο κοινής χρήσης κώδικα. Εκδόσεις δυνατοτήτων JDK και εκδόσεις ενημερώσεων JDK για Java 11 και μεταγενέστερες εκδόσεις θα αποτελούν μέρος αυτού του σχεδίου. Η μετάβαση σε Git, GitHub και Skara για το Mercurial JDK και JDK-sandbox έγινε στις 5 Σεπτεμβρίου και είναι ανοιχτή για συνεισφορές.

Οι εκδόσεις πρώιμης πρόσβασης του JDK 16 για Linux, Windows και MacOS βρίσκονται στο jdk.java.net. Όπως το JDK 15, το JDK 16 θα είναι μια βραχυπρόθεσμη κυκλοφορία, υποστηριζόμενη για έξι μήνες. Το JDK 17, το Σεπτέμβριο του 2021, θα είναι μια έκδοση μακροπρόθεσμης υποστήριξης (LTS) που θα λάβει υποστήριξη πολλών ετών Η τρέχουσα έκδοση LTS, JDK 11, κυκλοφόρησε τον Σεπτέμβριο του 2018.