مرحبا يا هبر! أقدم لكم ترجمة المقال " 90 ميزات جديدة (وواجهات برمجة تطبيقات) في JDK 11 " بقلم سايمون ريتر.

بالنسبة للكثيرين ، تعني دورة إصدار JDK الجديدة التي مدتها ستة أشهر أن البعض لم يكتشف حتى الميزات الجديدة الموجودة في JDK 10 ، و JDK 11 على وشك. في إحدى المدونات المبكرة ( الإنجليزية ) ، تم إدراج جميع الميزات الجديدة وواجهات برمجة التطبيقات الـ 109 التي تمكن من العثور عليها في JDK 10. لذلك ، بالنسبة لـ JDK 11 تقرر أن تفعل الشيء نفسه. ومع ذلك ، تم اختيار تنسيق مختلف. سيتم تقسيم هذه المشاركة إلى قسمين: الميزات الجديدة المتوفرة للمطورين (واجهة برمجة التطبيقات العامة) وكل شيء آخر. وبالتالي ، إذا كنت مهتمًا فقط بما يؤثر بشكل مباشر على تطورك ، فيمكنك تخطي الجزء الثاني.
أصبح إجمالي عدد التغييرات التي يمكن حسابها 90 (هذا هو JEP بالإضافة إلى فئات وأساليب جديدة ، باستثناء الطرق المنفصلة لعميل HTTP ومسجل Flight ) ( ملاحظة المترجم: Java Flight Recorder (JFR) كان أحد الإضافات المضمنة في Oracle في JDK ، ولكن بدءًا من Java 11 ، بفضل JEP 328 ، تم نقله إلى مصدر مفتوح) . على الرغم من أن JDK 11 تمكنت من العثور على أحد عشر تغييرًا أقل من JDK 10 ، أعتقد أنه من العدل القول أنه تمت إضافة المزيد من الوظائف إلى JDK 11 ، بالتأكيد على مستوى JVM.
ميزات جديدة ملحوظة للمطور
يحتوي JDK 11 على عدد قليل من التغييرات التي يمكن أن تؤثر على أسلوب التطوير. هناك تغيير طفيف في البنية ، والعديد من واجهات برمجة التطبيقات الجديدة والقدرة على تشغيل التطبيقات في ملف واحد دون استخدام مترجم (مترجم الملاحظة: ما يسمى ملفات shebang ). بالإضافة إلى ذلك ، التغيير الكبير (والكسر) هو إزالة وحدة التجميع java.se.ee ، والتي يمكن أن تؤثر على ترحيل تطبيق موجود إلى JDK 11.
JEP 323: تركيب متغير محلي لمعلمات لامدا
في JDK 10 ، تم إدخال الاستدلال المتغير المحلي (أو الاستدلال النوعي) ( JEP 286 ). يؤدي هذا إلى تبسيط الرمز لأنك لم تعد بحاجة إلى تحديد نوع المتغير المحلي بشكل صريح ، يمكنك استخدام var بدلاً من ذلك. يوسع JEP 323 استخدام هذا النحو ، والذي ينطبق الآن أيضًا على معلمات تعبيرات لامدا. مثال بسيط:
list.stream() .map((var s) -> s.toLowerCase()) .collect(Collectors.toList());
قد يشير مبرمج Java اليقظ إلى أن تعبيرات lambda لها بالفعل نوع الاستدلال ، لذا فإن استخدام var سيكون (في هذه الحالة) زائدة عن الحاجة. يمكننا بسهولة كتابة نفس الرمز كما يلي:
list.stream() .map(s -> s.toLowerCase()) .collect(Collectors.toList());
لماذا تضيف دعم var؟ الجواب هو حالة خاصة واحدة - عندما تريد إضافة تعليق توضيحي إلى معلمة لامدا. لا يمكن القيام بذلك دون أي نوع من المشاركة. لتجنب استخدام نوع صريح ، يمكننا استخدام var لتبسيط الأشياء بهذه الطريقة:
list.stream() .map((@Notnull var s) -> s.toLowerCase()) .collect(Collectors.toList());
يتطلب هذا التغيير إجراء تغييرات على مواصفات لغة جافا (JLS) ، على وجه الخصوص:
24 الصفحة: وصف معرف خاص var.
627-630 الصفحة: معلمات لامدا
636 الصفحة: تقييم وقت التشغيل لتعبيرات Lambda
746 الصفحة: بناء الجملة لامدا
JEP 330: تشغيل برامج شفرة المصدر أحادية الملف
أحد الانتقادات لجافا هو تكرار بناء الجملة ، و "الحفل" المرتبط بإطلاق حتى تطبيق تافه يمكن أن يزيد بشكل خطير عتبة الدخول للمبتدئين. لكتابة تطبيق يقوم ببساطة بطباعة "Hello World!" ، تحتاج إلى كتابة فئة باستخدام طريقة الفراغ الثابت العامة الرئيسية واستخدام الأسلوب System.out.println (). بعد القيام بذلك ، يجب عليك تجميع الكود باستخدام جافا سكريبت. أخيرًا ، يمكنك إطلاق تطبيق يرحب بالعالم. يعد تشغيل نفس البرنامج النصي في معظم اللغات الحديثة أبسط وأسرع.
يلغي JEP 330 الحاجة إلى ترجمة تطبيق أحادي الملف. أدخل الآن:
java HelloWorld.java
يحدد مشغل Java أن الملف يحتوي على كود مصدر Java ويجمع الكود في ملف * .class قبل تنفيذه.
الوسيطات الموضوعة بعد تمرير اسم الملف المصدر كوسيطات عند بدء تشغيل التطبيق. الوسيطات الموضوعة قبل تمرير اسم الملف المصدر يتم تمريرها كوسيطات إلى مشغل جافا بعد تجميع الكود (هذا يسمح لك بتعيين أشياء مثل classpath على سطر الأوامر). وسيجري أيضًا تمرير الحجج المتعلقة بالمترجم (مثل classpath) إلى جافا لتجميعها.
مثال:
java -classpath /home/foo/java Hello.java Bonjour
وستكون معادلة لما يلي:
javac -classpath /home/foo/java Hello.java java -classpath /home/foo/java Hello Bonjour
يوفر JEP هذا أيضًا دعمًا لملفات shebang. لتقليل الحاجة حتى إلى ذكر مشغل جافا في سطر الأوامر ، يمكنك تضمينه في السطر الأول من الملف المصدر. على سبيل المثال:
#!/usr/bin/java --source 11 public class HelloWorld { ...
مطلوب علامة -source مع إصدار Java المستخدم.
JEP 321: عميل HTTP (قياسي)
قدم JDK 9 واجهة برمجة تطبيقات جديدة لدعم بروتوكول HTTP Client ( JEP 110 ). نظرًا لأن JDK 9 قدم نظام Java Platform Module System (JPMS) ، فقد تم تضمين واجهة برمجة التطبيقات هذه كوحدة حاضنة . تم تصميم وحدات الحاضنة لتوفير واجهات برمجة تطبيقات جديدة ، ولكنها لا تحولها إلى معيار Java SE. يمكن للمطورين تجربة واجهة برمجة التطبيقات من خلال تقديم التعليقات. بعد إجراء التغييرات اللازمة (تم تحديث واجهة برمجة التطبيقات هذه في JDK 10) ، يمكن نقل واجهة برمجة التطبيقات إلى الوحدة الرئيسية لتصبح جزءًا من المعيار.
أصبحت واجهة برمجة تطبيقات عميل HTTP الآن جزءًا من معيار Java SE 11. وهذا يقدم وحدة وحزمة جديدة لـ JDK ، java.net.http . الفئات الرئيسية:
- Httpclient
- Httprequest
- HttpResponse
- مأخذ الويب
يمكن استخدام API بشكل متزامن أو غير متزامن. في الوضع غير المتزامن ، يتم استخدام CompletionFutures و CompletionStages.
JEP 320: إزالة وحدات Java EE و CORBA
مع إدخال JPMS في JDK 9 ، كان من الممكن تقسيم ملف rt.jar المترابط إلى عدة وحدات. تتمثل فائدة إضافية لـ JPMS في أنه يمكنك الآن إنشاء بيئة تشغيل Java تتضمن الوحدات النمطية اللازمة لتطبيقك فقط ، مما يقلل الحجم الإجمالي بشكل كبير. بفضل الحدود المحددة بوضوح ، أصبح من السهل الآن إزالة الوحدات القديمة من Java API. هذا ما يفعله هذا JEP. تشتمل الوحدة الوصفية java.se.ee على ست وحدات لن تكون جزءًا من معيار Java SE 11 ولن يتم تضمينها في JDK.
الوحدات البعيدة:
- كوربا ( ملاحظة المترجم:
ارقد بسلام ، يحترق في الجحيم ) - الصفقة
- التنشيط
- xml.bind
- xml.ws
- xml.ws.nnotation
تم وضع علامة على هذه الوحدات القديمة (Deprecated) منذ JDK 9 ولم يتم تضمينها بشكل افتراضي في الترجمة أو وقت التشغيل. إذا حاولت ترجمة أو تشغيل تطبيق باستخدام واجهة برمجة التطبيقات من هذه الوحدات على JDK 9 أو JDK 10 ، فإنك ستفشل. إذا كنت تستخدم واجهة برمجة التطبيقات من هذه الوحدات في التعليمات البرمجية ، فستحتاج إلى توفيرها كوحدة منفصلة أو مكتبة. إذا حكمنا من خلال المراجعات ، فيبدو أن وحدات java.xml التي تعد جزءًا من دعم خدمات الويب JAX-WS و SOAP هي التي ستتسبب في معظم المشكلات.
واجهة برمجة تطبيقات عامة جديدة
العديد من واجهات برمجة التطبيقات الجديدة في JDK 11 هي نتيجة حقيقة أن وحدة عميل HTTP هي الآن جزء من المعيار ، بالإضافة إلى تضمين Flight Recorder.
يمكن العثور على قائمة تخطيطية كاملة لتغييرات API ، بما في ذلك مقارنة الإصدارات المختلفة من JDK هنا.
فيما يلي جميع الطرق الجديدة بخلاف تلك الموجودة في وحدتي java.net.http و jdk.jfr. كما لم يتم سرد الطرق والفئات الجديدة في وحدات java.security ، وهي محددة تمامًا لتغييرات JEP 324 و JEP 329 (هناك ست فئات جديدة وثماني طرق جديدة).
java.io.ByteArrayOutputStream
- void writeBytes (byte []) : يكتب كافة وحدات البايت من الوسيطة إلى OutputStream
java.io.FileReader
اثنين من الشركات الجديدة التي تتيح لك تحديد Charset.
java.io.FileWriter
أربعة منشئات جديدة تتيح لك تحديد Charset.
- io.InputStream nullInputStream () : إرجاع InputStream الذي لا يقرأ وحدات البايت. بالنظر إلى هذه الطريقة (والأخرى في OutputStream و Reader و Writer) ، يُطرح السؤال عن سبب كونها مفيدة. يمكنك التفكير فيها على أنها / dev / null - للتخلص من المخرجات التي لا تحتاجها ، أو لتقديم مدخلات ترجع دائمًا وحدات بايت فارغة.
java.io.OutputStream
- io.OutputStream nullOutputStream ()
java.io.Reader
java.io.Writer
java.lang.Character
- String toString (int) : هذا هو شكل زائد من طريقة موجودة ، ولكن يتم استخدام int بدلاً من char. Int هي نقطة رمز Unicode.
java.lang.CharSequence
- int مقارنة (CharSequence ، CharSequence) : يقارن بين مثيلين من CharSequence معجميًا . إرجاع قيمة سالبة أو صفر أو قيمة موجبة إذا كان التسلسل الأول معجميًا أقل من المعجم أو مساوٍ له أو أكبر منه على التوالي.
مرجع java.lang.ref
- lang.Object clone () : يجب أن أعترف أن هذا التغيير يسبب الارتباك. لا تقوم الفئة المرجعية بتطبيق واجهة Cloneable ، وهذه الطريقة تطرح CloneNotSupportedException. يجب أن يكون هناك سبب لإدراجه ، ربما لشيء ما في المستقبل. ( ملاحظة المترجم: هناك مناقشة حول StackOverflow ، تذكرة في OpenJDK )
java.lang.Runtime
java.lang.System
لا توجد طرق جديدة هنا ، ولكن تجدر الإشارة إلى أن طريقة runFinalizersOnExit () تمت إزالتها الآن من كلا الفئتين (قد تكون هناك مشكلة عند الترحيل إلى JDK 11).
java.lang.String
أعتقد أن هذا هو أحد أبرز واجهات برمجة التطبيقات الجديدة في JDK 11. هناك بعض الطرق الجديدة المفيدة هنا.
- boolean isBlank () : تُرجع true إذا كانت السلسلة فارغة أو تحتوي على مسافات فقط ، وإلا فستكون خاطئة.
- خطوط الدفق () : إرجاع الدفق من سلسلة ، المستخرجة من هذه السلسلة ، مفصولة بفواصل الأسطر.
- Stringكرار (int) : ترجع سلسلة قيمتها سلسلة من هذه السلسلة ، مكررة عدة مرات.
- String strip () : إرجاع سلسلة قيمتها هذه السلسلة ، يزيل هذا كافة المسافات في بداية ونهاية السلسلة.
- String stripLeading () : تقوم بإرجاع سلسلة قيمتها هذه السلسلة ، مع إزالة كافة المسافات في بداية السطر.
- String stripTrailing () : إرجاع سلسلة قيمتها هذه السلسلة ، يؤدي هذا إلى إزالة كافة المسافات في نهاية السلسلة.
على الأرجح ، أنظر إلى الشريط () وتسأل: "كيف يختلف هذا عن طريقة القطع الحالية () ؟" الجواب يكمن في الفرق في تحديد المساحات. ( ملاحظة المترجم: باختصار ، الشريط () يفهم Unicode بشكل أفضل ، وتحليل مفصل على StackOverflow )
java.lang.StringBuffer
java.lang.StringBuilder
كل من هذه الفئات لديها أسلوب CompareTo () جديد يأخذ StringBuffer / StringBuilder ويعيد int. طريقة المقارنة المعجمية مشابهة لطريقة CompareTo () الجديدة في CharSequence.
جافا. لانج
لا توجد طرق جديدة. تمت إزالة طرق التدمير () وإيقاف (الرمي) . لا تزال طريقة stop () ، التي لا تأخذ أي حجج ، موجودة. قد يؤدي إلى مشكلة توافق.
java.nio.ByteBuffer
java.nio.CharBuffer
java.nio.DoubleBuffer
java.nio.FloatBuffer
java.nio.LongBuffer
java.nio.ShortBuffer
تحتوي جميع هذه الفئات الآن على طريقة عدم التطابق () ، التي تبحث عن وترجع الفهرس النسبي لعدم التطابق الأول بين هذا المخزن المؤقت والمخزن المؤقت الذي تم تمريره.
java.nio.channels.SelectionKey
- int InterestOpsAnd (int) : تعين مصلحة هذا المفتاح (مصلحة المفتاح) تلقائيًا على تقاطع البتات ("و") لمجموعة المصالح الحالية والقيمة التي تم تمريرها.
- int InterestOpsOr (int) : تحدد مصلحة هذا المفتاح (مصلحة المفتاح) تلقائيًا في اتحاد bitwise ("أو") لمجموعة المصالح الحالية والقيمة التي تم تمريرها.
java.nio.channels.Selector
- int select (java.util.function.Consumer، long) : تحديد وتنفيذ الإجراءات على المفاتيح التي تكون قنواتها المقابلة جاهزة لعمليات الإدخال / الإخراج. حجة طويلة مهلة.
- int select (java.util.function.Consumer) : نفس المذكور أعلاه ، ولكن بدون مهلة.
- int selectNow (java.util.function.Consumer) : كما هو مذكور أعلاه ، فقط غير قابل للحظر.
java.nio.file.Files
- String readString (المسار) : يقرأ كل المحتوى من ملف إلى سلسلة ، ويفك تشفير البايت من الأحرف إلى الأحرف باستخدام ترميز UTF-8.
- String readString (Path، Charset) : كما هو موضح أعلاه ، مع الاختلاف في أن فك الترميز من البايت إلى الأحرف يحدث باستخدام Charset المحدد.
- Path writeString (Path، CharSequence، java.nio.file.OpenOption []) : كتابة CharSequence إلى ملف. يتم ترميز الأحرف بالبايت باستخدام ترميز UTF-8.
- Path writeString (Path، CharSequence، java.nio.file.Charset، OpenOption []) : كما هو موضح أعلاه ، يتم ترميز الأحرف بالبايت باستخدام الترميز المحدد في Charset.
java.nio.file.Path
- مسار (سلسلة ، سلسلة []) : إرجاع المسار من وسيطة سلسلة المسار أو سلسلة من السلاسل التي ، عند دمجها ، تشكل سلسلة المسار.
- مسار (net.URI) : إرجاع المسار من URI.
java.util.Collection
- الكائن [] toArray (java.util.function.IntFunction) : إرجاع مصفوفة تحتوي على جميع العناصر في هذه المجموعة ، باستخدام وظيفة التوليد المقدمة لتخصيص الصفيف الذي تم إرجاعه.
java.util.concurrent.PriorityBlockingQueue
java.util.PriorityQueue
- void forEach (java.util.function.Consumer) : ينفذ الإجراء الذي تم تمريره لكل عنصر متكرر حتى تتم معالجة جميع العناصر أو يطرح الإجراء استثناءً.
- boolean removeAll (java.util.Collection) : يزيل جميع عناصر هذه المجموعة الموجودة أيضًا في المجموعة المحددة (عملية اختيارية).
- إزالة منطقية (java.util.function.Predicate) : تزيل جميع العناصر من هذه المجموعة التي ترضي المسند المحدد.
- boolean retainAll (java.util.Collection) : يحفظ فقط العناصر الموجودة في هذه المجموعة والموجودة في المجموعة المنقولة (عملية اختيارية).
java.util.concurrent.TimeUnit
- تحويل طويل (java.time.Duration) : تحويل المدة التي تم تمريرها إلى هذا النوع.
وظيفة java.util. المسند
- المسند لا (المسند) : إرجاع المسند ، وهو إنكار المسند المنقولة.
هذه واحدة من واجهات برمجة التطبيقات الجديدة المفضلة لدي في JDK 11. كمثال ، يمكنك تحويل هذا الرمز:
lines.stream() .filter(s -> !s.isBlank())
في
lines.stream() .filter(Predicate.not(String::isBlank))
أو إذا استخدمنا الواردات الثابتة:
lines.stream() .filter(not(String::isBlank))
أنا شخصياً أعتقد أن هذه النسخة مفهومة وأكثر إيجازاً.
java.util. اختياري
java.util.OptionalInt
java.util.OptionalDouble
java.util.OptionalLong
- boolean isEmpty () : إذا لم تكن هناك قيمة ، ترجع صواب أو خطأ.
java.util.regex.Pattern
- المسند asMatchPredicate () : أعتقد أنه قد يكون جوهرة JDK 11. API الجديدة. يُنشئ المسند الذي يتحقق مما إذا كان هذا القالب يتطابق مع سلسلة الإدخال المعطاة.
java.util.zip.Deflater
int deflate (ByteBuffer) : يضغط الإدخال ويملأ المخزن المؤقت المحدد به.
int deflate (ByteBuffer، int) : يضغط الإدخال ويملأ المخزن المؤقت المحدد به. إرجاع الكمية الفعلية للبيانات المضغوطة.
void setDictionary (ByteBuffer) : تعيين القاموس المحدد للضغط على وحدات البايت في هذا المخزن المؤقت. هذا هو شكل زائد من طريقة موجودة يمكن لـ ByteBuffer قبولها الآن ، بدلاً من صفيف بايت.
void setInput (ByteBuffer) : يضبط المدخلات المراد ضغطها. أيضا شكل زائد من طريقة موجودة.
java.util.zip.Inflater
- int inflate (ByteBuffer) : فك ضغط البايت في المخزن المؤقت المحدد. إرجاع العدد الفعلي للبايتات غير المضغوطة.
- void setDictionary (ByteBuffer) : لتعيين القاموس المحدد على وحدات البايت في هذا المخزن المؤقت. الشكل الزائد لطريقة موجودة.
- void setInput (ByteBuffer) : يضبط الإدخال لإلغاء الضغط. الشكل الزائد لطريقة موجودة.
javax.print.attribute.standard.DialogOwner
هذه فئة جديدة في JDK 11. تستخدم لدعم طلب لمربع حوار الطباعة أو إعداد الصفحة. يجب عرضها أعلى جميع النوافذ أو نافذة معينة.
javax.swing.DefaultComboBoxModel
javax.swing.DefaultListModel
- vAll addAll (Collection) : يضيف جميع العناصر الموجودة في المجموعة.
- void addAll (int، Collection) : يضيف جميع العناصر الموجودة في المجموعة ، بدءًا من الفهرس المحدد.
javax.swing.ListSelectionModel
- int [] getSelectedIndices () : إرجاع مصفوفة لجميع المؤشرات المحددة في النموذج المحدد بترتيب تصاعدي.
- int getSelectedItemsCount () : إرجاع عدد العناصر المحددة.
jdk.jshell.EvalException
- jshell.JShellException getCause () : تقوم بإرجاع غلاف سبب قابل للرمي في عميل التنفيذ ممثلة بـ EvalException ، أو فارغة إذا كان السبب غير موجود أو غير معروف.
ميزات جديدة (ليست واجهة برمجة تطبيقات عامة)
JEP 181: التحكم في الوصول القائم على عش
تدعم Java (ولغات أخرى) الفئات المتداخلة من خلال الطبقات الداخلية. للتشغيل الصحيح ، يجب على المترجم تنفيذ بعض الحيل. على سبيل المثال:
public class Outer { private int outerInt; class Inner { public void printOuterInt() { System.out.println("Outer int = " + outerInt); } } }
يقوم المترجم بتعديل هذا لإنشاء شيء مثل هذا قبل القيام بالتجميع:
public class Outer { private int outerInt; public int access$000() { return outerInt; } }
class Inner$Outer { Outer outer; public void printOuterInt() { System.out.println("Outer int = " + outer.access$000()); } }
على الرغم من أن الفئة الداخلية ، من الناحية المنطقية ، هي جزء من نفس التعليمات البرمجية للفئة الخارجية ، إلا أنها يتم تصنيفها على أنها فئة منفصلة. لذلك ، يتطلب هذا طريقة اصطناعية ("جسر") ، والتي يجب إنشاؤها بواسطة المترجم لتوفير الوصول إلى الحقل الخاص للفئة الخارجية.
يمثل هذا JEP مفهوم "مأخذ التوصيل" ، حيث جيران اثنين من أعضاء نفس مأخذ التوصيل (الخارجي والداخل من مثالنا). تمت إضافة سمتين جديدتين بتنسيق ملف * .class: NestHost و NestMembers. هذه التغييرات مفيدة أيضًا للغات الأخرى التي تم تجميعها بواسطة رمز ثانوي والتي تدعم الفئات المتداخلة.
توفر هذه الميزة ثلاث طرق جديدة لـ java.lang.Class:
- فئة getNestHost ()
- الفئة [] getNestMembers ()
- منطقي هو NestmateOf (clazz)
تتطلب هذه الميزة أيضًا تغييرات في مواصفات Java Virtual Machine (JVMS) ، خاصة في القسم 5.4.4 التحكم في الوصول.
JEP 309: ثوابت ملف الفئة الديناميكية
يصف هذا JEP امتداد تنسيق الملف * .class لدعم النموذج الجديد مع التجمع الثابت CONSTANT_Dynamic (يشار إليه غالبًا باسم condy في العروض التقديمية). تبدو فكرة الثابت الديناميكي أنها تناقض ، ولكن ، في الواقع ، يمكنك التفكير فيها كقيمة نهائية في Java. لا يتم تعيين قيمة التجمع الثابت في مرحلة التجميع (بخلاف الثوابت الأخرى) ، ولكن يتم استخدام طريقة التمهيد لتحديد القيمة في وقت التشغيل. لذلك ، تكون القيمة ديناميكية ، ولكن نظرًا لأنه يتم تعيين قيمتها مرة واحدة فقط ، فهي ثابتة أيضًا.
ستكون هذه الميزة مفيدة في المقام الأول لأولئك الذين يقومون بتطوير لغات ومجمعين جدد. من الذي سيقوم بإنشاء ملفات bytecode و * .class ليتم تشغيلها على JVM. سيؤدي هذا إلى تبسيط بعض المهام.
توفر هذه الميزة java.lang.invoke.ConstantBootstraps فئة جديدة مع تسع طرق جديدة. لن أدرجهم جميعًا هنا ؛ هذه هي طرق التمهيد للثوابت المحسوبة ديناميكيًا.
تتطلب هذه الميزة تغييرات في JVMS ، على وجه الخصوص ، في كيفية استخدام رمز البايت الخاص والقسم 4.4 من التجمع الثابت.
JEP 315: تحسين الجوهر الداخلي Aarch64
كان هذا هو JEP التي ساهمت بها Red Hat. يمكن لـ JVM الآن استخدام تعليمات أكثر تخصصًا متوفرة في مجموعة أوامر Arm 64. على وجه الخصوص ، يؤدي هذا إلى تحسين عملية sin () ، cos () ، وأساليب log () لفئة java.lang.Math.
JEP 318: جامع القمامة إبسيلون
ساهمت Red Hat أيضًا في هذا JEP. جامع القمامة إبسيلون غير معتاد إلى حد ما لأنه لا يجمع القمامة! ستخصص ذاكرة جديدة إذا لزم الأمر عند إنشاء كائنات جديدة ، ولكنها لا تحرر المساحة التي تشغلها الكائنات بدون روابط.
يبدو ، إذن ، ما هي الفائدة؟ هناك استخدامان على الأقل:
- بادئ ذي بدء ، تم تصميم هذا المجمع لضمان تقييم خوارزميات GC الجديدة من حيث تأثيرها على الأداء. الفكرة هي تشغيل تطبيق مثال باستخدام Epsilon GC وإنشاء مقياس. يتم تضمين خوارزمية GC جديدة ، ويتم تشغيل نفس الاختبارات ، ويتم مقارنة النتائج.
- بالنسبة للمهام القصيرة جدًا أو القصيرة العمر (فكر في وظيفة بدون خادم في السحابة) ، حيث يمكنك التأكد من عدم تجاوز الذاكرة المخصصة لمساحة الذاكرة. يمكن أن يؤدي ذلك إلى تحسين الأداء من خلال إزالة الحمل الزائد (بما في ذلك جمع الإحصائيات اللازمة لتحديد ما إذا كان سيتم تشغيل المجمّع) في رمز التطبيق.
في حالة استنفاد مساحة الكومة ، يمكن تكوين عملية JVM اللاحقة بإحدى الطرق الثلاث:
- يسمى OutOfMemoryError العادي.
- إعادة تعيين كومة الذاكرة المؤقتة
- من الصعب إيقاف JVM وربما تنفيذ مهمة خارجية (على سبيل المثال ، بدء تشغيل المصحح).
JEP 324: اتفاقية رئيسية مع Curve25519 و Curve448
تتغير معايير التشفير وتتحسن باستمرار. في هذه الحالة ، يتم استبدال مخطط Diffie-Hellman الحالي بمنحنى بيضاوي بـ Curve25519 و Curve448. هذا هو مخطط اتفاق رئيسي محدد في RFC-7748.
JEP 327: يونيكود 10
يدعم نظام Java الأساسي Unicode لتمكين معالجة جميع مجموعات الأحرف. منذ أن تم تحديث Unicode إلى الإصدار 10 ، تم تحديث JDK أيضًا لدعم هذا الإصدار من المعيار.
أنا مفتون دائمًا لمعرفة ما يشتمل عليه مطورو Unicode في الإصدارات الجديدة. يحتوي Unicode 10 على 8.518 حرفًا جديدًا. يتضمن هذا رمز Bitcoin ، ومجموعة أحرف Nüshu (التي تستخدمها النساء الصينيات لكتابة القصائد) ، و Soyombo و Zanabazar Square (هي الأحرف المستخدمة في النصوص البوذية التاريخية لكتابة اللغات السنسكريتية والتبتية والمنغولية). تمت إضافة العديد من الرموز التعبيرية الأخرى أيضًا ، بما في ذلك Colbert Emoji الذي طال انتظاره (على ما يبدو).
تذكر أنه بدءًا من JDK 9 ، يمكنك استخدام UTF-8 في ملفات الخصائص (.properties). هذا يعني أنه يمكن استخدام أي حرف Unicode في مثل هذه الملفات. بما في ذلك الرموز التعبيرية. أو نوشو.
JEP 328: مسجل الطيران
Flight Recorder — JVM. JDK 11 Oracle JDK. , Oracle Oracle JDK OpenJDK, OpenJDK.
JEP :
: jdk.jfr jdk.management.jfr.
JEP 329: ChaCha20 and Poly1305 Cryptographic Algorithms
JEP 324, , JDK. ChaCha20 ChaCha20-Poly1305, RFC 7539. ChaCha20 — , , RC4.
JEP 331: Low-overhead Heap Profiling
, JEP, Google. Java JVM.
:
JEP 332: Transport Layer Security (TLS) 1.3
TLS 1.3 (RFC 8446) " " TLS . JDK , Datagram Transport Layer Security (DTLS).
JEP 333: ZGC A Scalable, Low Latency Garbage Collector
, , () . ( , Weak Generational Hypothesis ) ( ) GC . "" , . .
ZGC — region-based ( G1), NUMA aware compacting . .
pauseless , C4 Zing JVM.
JEP 335: Deprecate the Nashorn Scripting Engine
Nashorn JDK 8 Rhino Javascript . , Nashorn API jjs Java. , . Graal VM , , .
JEP 336: Deprecate the Pack200 Tools and APIs
Pack200 — JAR-, Java SE 5.0. JPMS JDK 9 Pack200 JDK. pack200 unpack200 API Pack200 java.util.jar JDK. , .
الاستنتاجات
JDK 11 — LTS JDK ( ). , , , , JVM , .
Zulu JDK 11 !
JDK 11?
( . : , )