مقدمة
تحتوي اللغات ذات المستوى المنخفض ، مثل C ، على بدائل لإدارة الذاكرة منخفضة المستوى ، مثل Malloc () و Free (). من ناحية أخرى ، يتم تخصيص بدائل ذاكرة JavaScript عند إنشاء المتغيرات (الكائنات ، السلاسل ، إلخ) ثم تحريرها "تلقائيًا" عندما لم تعد قيد الاستخدام. هذا الأخير يسمى مجموعة القمامة. هذا "الأوتوماتيكي" يتأرجح وإعطاء مطوري JavaScript (وغيرها من اللغات عالية المستوى) وهمًا: يمكنهم تجاهل إدارة الذاكرة.
دورة حياة الذاكرة
بغض النظر عن لغة البرمجة ، فإن دورة حياة الذاكرة هي نفسها:
1. تخصيص الذاكرة التي تحتاجها
2. استخدمه (اقرأ ، اكتب)
3. إطلاق PS: و "وضع الفيل في الثلاجة" يعني نفس الشيء
الجزءان الأول والثاني من العملية واضح في جميع اللغات. الخطوة الأخيرة واضحة في اللغات ذات المستوى المنخفض ، ولكن بلغات عالية المستوى مثل JavaScript ، فإن الخطوة الأخيرة غير واضحة.
تخصيص الذاكرة لجافا سكريبت
التهيئة المتغيرة
من أجل عدم إزعاج المبرمجين مع مشكلة التخصيص ، تكمل JavaScript تخصيص الذاكرة عند تحديد المتغيرات.
نسخة الكود كما يلي:
var n = 123 ؛
var s = "Azerty" ؛
var o = {
ج: 1 ،
ب: فارغة
} ؛
var a = [1 ، null ، "bra"] ؛
وظيفة f (a) {
إرجاع A + 2 ؛
} // تخصيص الذاكرة للوظائف (كائنات قابلة للاتصال)
// تعبيرات الوظائف يمكن أيضًا تعيين كائن
sithelement.addeventListener ('click' ، function () {
sithelement.style.backgroundColor = 'Blue' ؛
}، خطأ شنيع)؛
تخصيص الذاكرة من خلال مكالمات الوظائف
تؤدي بعض مكالمات الوظائف إلى تخصيص ذاكرة الكائن:
نسخة الكود كما يلي:
var d = new Date () ؛
var e = document.createElement ('div') ؛
بعض الأساليب تخصيص متغيرات جديدة أو كائنات جديدة:
نسخة الكود كما يلي:
var s = "azerty" ؛
var S2 = S.Substr (0 ، 3) ؛
// نظرًا لأن السلسلة ثابتة ، فقد لا تخصص JavaScript الذاكرة ، ولكنها تخزن فقط النطاق 0-3.
var a = ["ouais ouais" ، "nan nan"] ؛
var A2 = ["Generation" ، "Nan Nan"] ؛
var A3 = A.Concat (A2) ؛
استخدام القيم
إن عملية استخدام القيم هي في الواقع عملية قراءة وكتابة لتخصيص الذاكرة ، مما يعني أنه يمكن كتابة قيمة المتغير أو قيمة خاصية الكائن ، أو حتى معلمات الوظيفة يمكن تمريرها.
تحرير عندما لم تعد هناك حاجة للذاكرة
معظم مشاكل إدارة الذاكرة في هذه المرحلة. إن أصعب مهمة هنا هي العثور على "الذاكرة المخصصة لم تعد مطلوبة بالفعل". غالبًا ما يتطلب الأمر من المطورين تحديد قطعة الذاكرة في البرنامج لم تعد مطلوبة وتحريرها.
يتم تضمين مترجم اللغة عالية المستوى مع "جامع القمامة" ووظائفه الرئيسية هي تتبع تخصيص الذاكرة واستخدامها بحيث يتم إصدارها تلقائيًا عندما لم تعد الذاكرة المخصصة قيد الاستخدام. هذه العملية هي تقريب لأنه من المستحيل تحديد ما إذا كان يجب تحديد جزء معين من الذاكرة (لا يمكن حلها بواسطة بعض الخوارزمية).
إعادة تدوير القمامة
كما ذكر أعلاه ، فإن مسألة البحث تلقائيًا عما إذا كانت بعض الذاكرة "لم تعد مطلوبة" من المستحيل تحديدها. لذلك ، يمكن لتنفيذ جمع القمامة حل المشكلات العامة مع القيود فقط. سيشرح هذا القسم المفاهيم اللازمة لفهم خوارزميات جمع القمامة الرئيسية وقيودها.
يقتبس
تعتمد خوارزميات جمع القمامة بشكل رئيسي على مفهوم المرجع. في بيئة تديرها الذاكرة ، إذا كان للكائن إذنًا للوصول إلى كائن آخر (ضمنيًا أو صريحًا) ، يطلق عليه كائن يشير إلى كائن آخر. على سبيل المثال ، يحتوي كائن JavaScript على إشارة إلى النموذج الأولي (مرجع ضمني) ومرجع إلى خصائصه (مرجع صريح).
هنا ، ليس مفهوم "الكائن" كائنات JavaScript الخاصة فحسب ، بل أيضًا نطاق الوظائف (أو النطاق المعجمي العالمي).
مجموعة القمامة المرجعية
هذه هي أسهل خوارزمية مجموعة القمامة. تبسط هذه الخوارزمية "ما إذا كان الكائن لم يعد مطلوبًا" على أنه "ما إذا كان الكائن يحتوي على كائنات أخرى مشار إليها". إذا لم يكن أي مرجع يشير إلى الكائن (مرجع صفر) ، فسيتم إعادة تدوير الكائن بواسطة آلية جمع القمامة.
على سبيل المثال
نسخة الكود كما يلي:
var o = {
ج: {
ب: 2
}
} ؛
// يتم إنشاء كائنين ، يتم الرجوع إلى أحدهما كسممة أخرى ، والآخر مخصص للمتغير o
من الواضح أنه لا يمكن جمع أي منهم عن طريق القمامة
var O2 = O ؛
o = 1 ؛
var oa = o2.a ؛
// الآن ، هناك مرجعان إلى "هذا الكائن" ، أحدهما O2 والآخر هو OA
O2 = "Yo" ؛
// يمكن إعادة تدويره
// ومع ذلك ، فإن كائن خاصته A لا يزال يشير إليه OA ، لذلك لا يمكن إعادة تدويره بعد
الزراعة العضوية = خالية
// يمكن جمع القمامة
القيد: إعادة تدوير المرجع
تحتوي هذه الخوارزمية البسيطة على قيود على أنه إذا كان الكائن يشير إلى آخر (يشكل مرجعًا دائريًا) ، فقد "لم يعد بحاجة إليه" ، لكن لن يتم إعادة تدويرها.
نسخة الكود كما يلي:
وظيفة f () {
var o = {} ؛
var o2 = {} ؛
الزراعة العضوية = O2 ؛
O2.A = O ؛
إرجاع "الأذرتي" ؛
}
f () ؛
// يتم إنشاء كائنين وإشارة إلى بعضهما البعض ، مما يشكل حلقة
// لن يتركوا نطاق الوظيفة بعد استدعاؤهم
// لذلك فهي عديمة الفائدة ويمكن إعادة تدويرها
// ومع ذلك ، فإن خوارزمية العد المرجعية تأخذ في الاعتبار أن لديهم إشارات إلى بعضها البعض مرة واحدة على الأقل ، لذلك لن يتم إعادة تدويرها
أمثلة عملية
أي 6 ، 7 إعادة تدوير المرجعية على كائنات DOM. مشكلة شائعة بالنسبة لهم هي تسرب الذاكرة:
نسخة الكود كما يلي:
var div = document.createElement ("div") ؛
div.onclick = function () {
dosomething () ؛
} ؛
// Div لديه إشارة تشير إلى خاصية معالجة الأحداث OnClick
// معالجة الأحداث لديها أيضًا إشارة إلى DIV يمكن الوصول إليها في نطاق الوظيفة
// سيؤدي هذا المرجع الدائري إلى جمع القمامة على كلا الكائنين
خوارزمية تسليط مارك
تبسط هذه الخوارزمية "ما إذا كان الكائن لم يعد مطلوبًا" كـ "ما إذا كان الكائن متاحًا".
تفترض هذه الخوارزمية تعيين كائن يسمى الجذر (في JavaScript ، الجذر هو كائن عالمي). بانتظام ، سيبدأ جامع القمامة من الجذر ، ويجد جميع الكائنات المشار إليها من الجذر ، ثم العثور على الكائنات المشار إليها في هذه الكائنات ... بدءًا من الجذر ، سيجد جامع القمامة جميع الكائنات التي يمكن الحصول عليها وجميع الكائنات التي لا يمكن الحصول عليها.
هذه الخوارزمية أفضل من الخوارزمية السابقة ، لأن "الكائنات ذات المراجع الصفرية" غير متوفرة دائمًا ، ولكن على العكس من ذلك ، فإن هذا ليس صحيحًا بالضرورة ، تشير إلى "المراجع الدائرية".
منذ عام 2012 ، استخدمت جميع المتصفحات الحديثة خوارزمية جمع القمامة. تستند جميع التحسينات على خوارزمية مجموعة JavaScript Garbage إلى تحسينات في خوارزمية تنظيف العلامات ، دون تحسين خوارزمية تنظيف العلامات نفسها وتعريفها المبسط لما إذا لم يعد الكائن مطلوبًا.
المراجع الدائرية لم تعد مشكلة
في المثال أعلاه ، بعد إرجاع استدعاء الوظيفة ، لا يمكن استرداد كلا الكائنين من الكائن العالمي. لذلك ، سيتم إعادة تدويرها من قبل جامع القمامة.
المثال الثاني أيضًا ، بمجرد أن لا يمكن استرداد Div ومعالجة الأحداث الخاصة به من الجذر ، سيتم إعادة تدويرها بواسطة جامع القمامة.
القيد: يجب أن تكون الكائنات غير متوفرة بشكل صريح
على الرغم من أن هذا هو القيد ، إلا أنه نادراً ما يتم اختراقه ، وهذا هو السبب في ذلك في الواقع ، القليل من الناس يهتمون بآلية جمع القمامة.