مرحبًا مرة أخرى! افتتحنا المجموعة التالية في المجموعة التاسعة الآن
، مجموعة
Java Developer (والمجموعة العاشرة في الخطط ، فجأة ، في 31 ديسمبر) وقمنا بإعداد مواد مثيرة للاهتمام
ودرس مفتوح لك.
لذا دعنا نذهب.
هل تريد تقليل حجم الذاكرة المستخدمة من قبل تطبيق Java الخاص بك؟ تعرف على كيفية تحسين الأداء باستخدام السلاسل المدمجة المتوفرة في Java 9.
إحدى تحسينات الأداء المقدمة في JVM (على سبيل المثال ، Oracle HotSpot ، على وجه الدقة) ، كجزء من Java SE 9 ، تبين أنها سلاسل مضغوطة. وتتمثل مهمتهم في تقليل حجم كائنات String ، مما يسمح بتقليل إجمالي (البصمة) للذاكرة التي يستهلكها التطبيق. ونتيجة لذلك ، يمكن أن يقلل ذلك من مقدار الوقت المستغرق في جمع القمامة.

تعتمد الوظيفة على ملاحظة أن العديد من كائنات String لا تحتاج إلى 2 بايت لترميز كل حرف ، لأن معظم التطبيقات تستخدم أحرف لاتينية -1 فقط. لذلك ، بدلاً من ذلك:
private final char value[];
الآن في
java.lang.String
:
private final byte[] value; private final byte coder;
بمعنى آخر ، تستبدل هذه الوظيفة القيمة في الصفيف
char
(حيث يستخدم كل عنصر 2 بايت) بمصفوفة بايت مع بايت إضافي لتحديد الترميز (Latin-1 أو UTF-16). هذا يعني أنه في معظم التطبيقات التي تستخدم أحرف لاتينية واحدة فقط ، سيتم استخدام نصف كومة الذاكرة المؤقتة فقط. لن يلاحظ المستخدم الاختلافات ، ولكن واجهات برمجة التطبيقات ذات الصلة ، مثل
StringBuilder
، ستستفيد تلقائيًا من ذلك.
لإظهار هذا التغيير من حيث حجم كائن String ، سأستخدم Java Object Layout ، وهو أداة بسيطة لتصور بنية الكائن في كومة الذاكرة المؤقتة. من وجهة النظر هذه ، نحن مهتمون بصمة المصفوفة (المخزنة في متغير القيمة أعلاه) ، وليس مجرد مرجع (يستخدم مرجع صفيف بايت ، مثل مرجع صفيف الأحرف ، 4 بايت). يعرض الرمز أدناه المعلومات باستخدام JOL
GraphLayout
:
public class JOLSample { public static void main(String[] args) { System.out.println(GraphLayout.parseInstance("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz").toFootprint()); } }
) toFootprint ())؛ public class JOLSample { public static void main(String[] args) { System.out.println(GraphLayout.parseInstance("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz").toFootprint()); } }
يُظهر تشغيل الرمز أعلاه في Java 8 ثم في Java 9 الفرق:
$java -version java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) $java -cp lib\jol-cli-0.9-full.jar;. test.JOLSample java.lang.String@4554617cd footprint: COUNT AVG SUM DESCRIPTION 1 432 432 [C 1 24 24 java.lang.String 2 456 (total) ... $java -version java version "9" Java(TM) SE Runtime Environment (build 9+181) Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode) $java -cp lib\jol-cli-0.9-full.jar;. test.JOLSample java.lang.String@73035e27d footprint: COUNT AVG SUM DESCRIPTION 1 224 224 [B 1 24 24 java.lang.String 2 248 (total)
بتجاهل حجم 24 بايت للمكونات الداخلية لـ java.lang.String (رأس زائد روابط) ، نرى أنه بسبب صغر حجمه ، انخفض الحجم بمقدار النصف تقريبًا.
إذا استبدلنا السطر أعلاه بخط آخر باستخدام أحرف UTF-16 ، على سبيل المثال \ u0780 ، ثم أعدنا تشغيل الرمز أعلاه ، فسيعرض كل من Java 8 و Java 9 نفس البصمة ، حيث لن يتم استخدام الضغط بعد ذلك.
يمكنك تعطيل هذه الوظيفة بتمرير
-XX:-CompactStrings
إلى الأمر
java
.
كما هو الحال دائمًا ، نحن في انتظار تعليقاتكم وأسئلتكم هنا ، كما ندعوكم إلى
درس مفتوح .