
- بواسطة x32x01 ||
هل سألت نفسك قبل كده إزاي الـ JavaScript بتتعامل مع الذاكرة؟ 
موضوع مهم جدًا بيأثر على أداء أي تطبيق وهو الـ Garbage Collector واللي مسؤول عن إدارة الميموري وتنظيفها من البيانات اللي مالهاش لازمة.
الـJavaScript بتقسم البيانات لنوعين رئيسيين:
الفرق الأساسي إن الـPrimitive بيتخزن جوه الـVariable نفسه، أما الـReference فـبيحتوي على "عنوان" في الذاكرة.
تخيل عندك 3 Objects كل واحد بيشاور على التاني زي سلسلة دايرة على نفسها 
هنا بتظهر مشكلة اسمها Circular Reference Problem - لأن كل Object شايل Reference للتاني، وده بيمنع الـGarbage Collector من حذفهم حتى لو خلاص مش محتاجهم.
الـ Reference Counting Algorithm فكرته بسيطة جدًا:
"أي Object مش بيشاور عليه ولا Variable واحد، امسحه من الذاكرة."
يعني لما عدد الـReferences لأي Object يوصل لصفر، يتم مسحه
لكن العيب الكبير؟
لو فيه Circular Reference - مش هيقدر يمسح أي حاجة، لأن كل Object لسه متشاور عليه من التاني
الـ Mark-And-Sweep Algorithm جاي يحل المشكلة دي 
الفكرة إنه بيبدأ من حاجة اسمها Root (زي الـGlobal Object أو الـWindow)، ويمشي يشوف كل العناصر اللي ممكن يوصلها.
أي Object مش ممكن توصله من الـRoot، بيتحذف على طول من الذاكرة.
الميزة: بيحل مشكلة الـCircular Reference.
العيب: بيوقف البرنامج مؤقتًا أثناء المسح (Pause) وبيستهلك موارد أكتر.
الاثنين ليهم مميزات وعيوب، ومفيش Algorithm كامل، لكن الـ Mark-And-Sweep هو اللي بيُستخدم في JavaScript الحديثة لأنه أكثر أمانًا ودقة في إدارة الذاكرة 

لو بتشتغل على مشاريع كبيرة، حاول دايمًا تتجنب الـCircular References بإنك تمسح الـReferences اللي مش محتاجها يدويًا (تخليها null) 
لو استفدت من الشرح
شارك المقال مع أصحابك
واكتب في التعليقات إيه أكتر Algorithm شايفه عبقري في طريقة عمله!


موضوع مهم جدًا بيأثر على أداء أي تطبيق وهو الـ Garbage Collector واللي مسؤول عن إدارة الميموري وتنظيفها من البيانات اللي مالهاش لازمة.
أنواع البيانات في JavaScript
الـJavaScript بتقسم البيانات لنوعين رئيسيين:- Primitive Values: زي الأرقام والنصوص والـBoolean ودي بتتخزن في الـStack مباشرة.
- Reference Values: زي الـObjects والـArrays ودي بتتخزن في الـHeap، والـVariable بيشاور عليها مش بيخزنها فعليًا.

مشكلة الـCircular Reference
تخيل عندك 3 Objects كل واحد بيشاور على التاني زي سلسلة دايرة على نفسها 
هنا بتظهر مشكلة اسمها Circular Reference Problem - لأن كل Object شايل Reference للتاني، وده بيمنع الـGarbage Collector من حذفهم حتى لو خلاص مش محتاجهم.
أول Algorithm: Reference Counting
الـ Reference Counting Algorithm فكرته بسيطة جدًا:"أي Object مش بيشاور عليه ولا Variable واحد، امسحه من الذاكرة."
يعني لما عدد الـReferences لأي Object يوصل لصفر، يتم مسحه

لكن العيب الكبير؟
لو فيه Circular Reference - مش هيقدر يمسح أي حاجة، لأن كل Object لسه متشاور عليه من التاني

ثاني Algorithm: Mark-And-Sweep
الـ Mark-And-Sweep Algorithm جاي يحل المشكلة دي 
الفكرة إنه بيبدأ من حاجة اسمها Root (زي الـGlobal Object أو الـWindow)، ويمشي يشوف كل العناصر اللي ممكن يوصلها.
أي Object مش ممكن توصله من الـRoot، بيتحذف على طول من الذاكرة.


مقارنة بين Reference Counting وMark-And-Sweep
الخاصية | Reference Counting | Mark-And-Sweep |
---|---|---|
الأداء | سريع ومباشر | أبطأ بسبب عملية المسح |
مشكلة الـCircular Reference | ![]() | ![]() |
استهلاك الموارد | أقل | أكتر |
تنفيذ الكود | بدون توقف | بيعمل Pause مؤقت |
الخلاصة
الاثنين ليهم مميزات وعيوب، ومفيش Algorithm كامل، لكن الـ Mark-And-Sweep هو اللي بيُستخدم في JavaScript الحديثة لأنه أكثر أمانًا ودقة في إدارة الذاكرة 

نصيحة خفيفة
لو بتشتغل على مشاريع كبيرة، حاول دايمًا تتجنب الـCircular References بإنك تمسح الـReferences اللي مش محتاجها يدويًا (تخليها null) 


واكتب في التعليقات إيه أكتر Algorithm شايفه عبقري في طريقة عمله!


- 01.jpg |38.2 كيلوبايت - المشاهدات: 152
- 02.jpg |12.5 كيلوبايت - المشاهدات: 148
- 03.jpg |15.3 كيلوبايت - المشاهدات: 150
- 04.jpg |16.9 كيلوبايت - المشاهدات: 151
- 05.jpg |18.9 كيلوبايت - المشاهدات: 152
- 06.jpg |19.8 كيلوبايت - المشاهدات: 158
- 07.jpg |22.5 كيلوبايت - المشاهدات: 149
- 08.jpg |23.9 كيلوبايت - المشاهدات: 150
- 09.jpg |24.4 كيلوبايت - المشاهدات: 148
التعديل الأخير: