في 19 أغسطس، أصدرت Oracle JDK 8u20. يتضمن JDK 8u20 العديد من الميزات الجديدة، مثل تحديثات مترجم Java، ودعم تعديل معلمات MinHeapFreeRatio وMaxHeapFreeRatio من خلال واجهات برمجة التطبيقات في وقت التشغيل، ومستندات دليل ضبط GC الجديدة. ومع ذلك، من بين الميزات الجديدة العديدة، فإن الميزة الأكثر توقعًا هي إلغاء البيانات المكررة للسلسلة. لقد كانت كيفية تقليل استخدام الذاكرة دائمًا موضوعًا أبديًا في تطبيقات Java، وغالبًا ما يُلاحظ أن كائن String يستهلك 30٪ من ذاكرة التطبيق، وهو أحد الكائنات الأكثر استخدامًا في Java. يمكن أن تساعد ميزة إلغاء البيانات المكررة للسلسلة الجديدة في تقليل أثر الذاكرة لكائنات السلسلة في التطبيقات، حاليًا، هذه الميزة متاحة فقط لمجمع البيانات المهملة G1 ولا يتم تمكينها افتراضيًا.
يشرح فابيان لانج كيفية تنفيذ إلغاء البيانات المكررة للسلسلة:
انسخ رمز الكود كما يلي:
سيقوم جامع البيانات المهملة بوضع علامة على مصفوفة الأحرف لكائن السلسلة عند الوصول إليها، وحفظ قيمة التجزئة للسلسلة والمرجع الضعيف في مصفوفة. عندما يجد جامع البيانات المهملة كائن سلسلة آخر بنفس قيمة التجزئة، فإنه يقارن بين الكائنين حرفًا بحرف. إذا كانت متطابقة تمامًا، فسيتم تعديل سلسلة واحدة للإشارة إلى مصفوفة الأحرف الخاصة بالسلسلة الأخرى. وبما أن مصفوفة الأحرف الأولى لم تعد مرجعية، فيمكن إعادة تدويرها. سيحاول جامع البيانات المهملة تقليل تكلفة العملية بأكملها، على سبيل المثال، إذا تم فحص كائن سلسلة ولم يتم العثور على أي تكرارات، فلن يتم فحصه مرة أخرى في الفترة الزمنية التالية.
بعد ذلك، شرح فابيان لانج التأثير السحري لإلغاء البيانات المكررة من خلال التعليمات البرمجية. قم أولاً بتشغيل التعليمات البرمجية التالية باستخدام Java 8 Update 20 مع المعلمات -Xmx256m -XX:+UseG1GC:
انسخ رمز الكود كما يلي:
الطبقة العامة LotsOfStrings {
نهائي ثابت خاص LinkedList<String> LOTS_OF_STRINGS = new LinkedList<>();
public static void main(String[] args) يطرح الاستثناء {
التكرار الدولي = 0؛
بينما (صحيح) {
لـ (int i = 0; i < 100; i++) {
لـ (int j = 0; j < 1000; j++) {
LOTS_OF_STRINGS.add(new String("String " + j));
}
}
التكرار++;
System.out.println("التكرار الذي نجا:" + التكرار);
Thread.sleep(100);
}
}
}
سينتهي تشغيل الكود بسبب استثناء OutOfMemoryError بعد 30 حلقة. بعد استخدام المعلمات -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics لتمكين ميزة إلغاء البيانات المكررة للسلسلة، يمكن تشغيل البرنامج لفترة أطول من الوقت. يمكنك أيضًا معرفة المزيد حول تفاصيل عملية إلغاء البيانات المكررة بالكامل من خلال سجلات JVM. ويطلب من القراء اختباره بأنفسهم.
أخيرًا، أوضح فابيان لانج أيضًا الفرق بين إلغاء البيانات المكررة للسلسلة وإقامة السلسلة، وهما متشابهان جدًا، باستثناء أن إقامة السلسلة تعيد استخدام مثيل السلسلة بالكامل، في حين أن إلغاء البيانات المكررة للسلسلة يستهدف فقط مصفوفة أحرف السلسلة.
(ينتهي النص الكامل)