لمحة جافاوية 65: لماذا string pool

لماذا String pool؟
سؤال طرحته على مجموعة جافا للمهندسين
لكي نعرف لماذا علينا أن نعرف بعض المعلومات عن جافا وآلية تعاملها مع String
String من الفئات المشهورة جداً في جافا
حيث تمثل مجموعة من الحروف المخزنة في مصفوفة ما
جافا تمكنك من الحصول على كائن بإحدى طريقتين

String s="alaa";

أو

String s=new String("alaa");

في النسخ الأولى من جافا
كانت كلا الطريقتين تقوم ببناء كائن جديد لك
لاحظوا السلوك التالي

for(int i=0;i<=30;i++){
	int i=0;
}

جافا في حالة المتغيرات البدائية primative types
لا تقوم بعمل كائنات لهذه المتغيرات وإنما مجرد قيمة تخزن فقط
ماذا لو كانت الشيفرة التالية

for(int i=0;i<=30;i++){
	String s="alaa";
}

الشيفرة لا توحي بأنك تقوم بعمل كائن وإنما وكأنك تستخدم نوع بدائي
المشكلة أنك ممكن ببساطة أن تستخدم الشيفرة السابقة
تخيل لو كان التكرار أكبر من هذا
ما حجم الذاكرة المستهلكة كل مرة
صن اكتشفت أن جزء أساسي من استهلاك الجافا للذاكرة كان بسبب أشياء مثل هذه
لهذا عملت على إيجاد حل لهذه المشكلة
فأوجدت String pool
قواعد String pool هي كالتالي
أي جملة يتم إنشاؤها باستخدام أسلوب "something" تدخل في الـ pool
أي جملة يتم إنشاؤها بأسلوب new String لا تدخل في pool
فعلياً كما أشرت مسبقاً في حالة "string" فإن المستخدم بسهولة قد يسيء استخدامها
لكن عندما يستخدم new String فإنه يعنيها بطريقة أو بأخرى

طيب لماذا لا يتم إدخال new String في موضوع الـ pool
كون المستخدم أحياناً قد يخطئ ويقوم بشيء مماثل للتالي

for(int i=0;i<=30;i++){
	String s=new String("alaa");
}

جافا تعتمد على جامع النفايات garbage collector
في عملية إزالة الكائنات منتهية الصلاحية -أي كائن لا يوجد عليه مؤشر refrence في البرنامج-
فإذا فرضنا أن كل كائن جديد سيتم وضعه في String pool
فإن هذه الكائنات سيصبح هناك من يؤشر عليها refrence وهو String pool
لذا فإنها لن تموت حتى لو انتهى أثرها في البرنامج
المشكلة الأساسية هنا تكمن في
1- أن الفئة String مستخدمة وبشدة
فلا يكاد برنامج كبر أو صغر إلا واستخدمها وبقوة
2- والفئة String من الفئات immutable
وهي الفئات التي كائناتها لا تتغي حالتها أبداً منذ إنشائها إلى موتها
فإن عملية على أي كائن String سينتج عنها كائن جديد
مثلاً

"alaa".substring(2);

فإنها سينتج عنها كائن جديد
لذا لو دخلت new String في اللعبة

فإذا فرضنا أن بناء String pool هو HashMap
فإن كل كائن من النوع String سيبقى في الذاكرة إلى أن ينتهي البرنامج
وكون البرنامج يستخدم الكثير من عمليات String فهذا يعني الكثير من الكائنات مع القليل من الفائدة
لأن غالبية الكائنات لا تتكرر
أما إذا فرضنا أنا بناء String pool هو CashedHashMap
فإنه سيكون جيد وسيء في نفس الوقت
جيد لأن عدد الكائنات الموجودة في الـ cash لن تكون كبيرة
سيء لأن إدارة الـ cash ستكون صعبة
وقد تأكل الكائنات الغير مفيدة الكائنات المفيدة

الملخص
String pool شيء جيد جداً وغالبية اللغات الحديثة التي تعتمد على الآلة الافتراضية تستخدمه
string pool يوجد به الكائنات على غرار "string"
String pool لا توجد به الكائنات على غرار new String
يجب أن تكون حذر في التعامل مع الكائنات الاخيرة
يمكنك الاستفادة من String pool عن طريق استخدام الدالة intern

تحياتي

Tags: , , , , , ,

2 Responses to “لمحة جافاوية 65: لماذا string pool”

  1. raouf_dz قال:

    جزيل الشكر أخ علاء على الافادة

Leave a Reply