فرآیند مدیریت حافظه در جاوا اسکریپت (memory management)

فرآیند مدیریت حافظه در جاوا اسکریپت (memory management) نوشته شده در   javascript ۷ مهر , ۱۳۹۷ توسط  عباس حسینی

memory management این امکان را فراهم میکند که، فضای حافظه به بهترین و بهینه ترین روش مورد استفاده قرار گیرد و این کار از طریق تخصیص داینامیک حافظه به برنامه و آزاد سازی آن در زمان ماسب انجام میگیرد

لیست مطالب

نحوه تخصیص حافظه در جاوا اسکریپت

وقتی جاوا اسکریپت یک کد را کامپایل میکند بر اساس نوع داده هر متغیر ،میزان فضایی که اشغال میکند را تعیین میکند برای درک بهتر این موضوع به کد زیر توجه کنید


var x = 'hi';

در این کد مقدار hi به متغیر x تخصیص داده شده، جاوا اسکریپت بعد از تشخیص میزان حافظه مورد نیاز برای آن بلافاصله آن را در حافظه قرار میدهد و پس از قرار گرفتن در حافظه یک آدرس به آن تخصیص میدهد تا بتوان به آن اشاره کرد

در شکل زیر نحوه کار این تخصیص در memery stack به تصویر کشیده شده است که آدرس های ۲۰۰۱ تا ۲۰۰۳ به ترتیب نوع داده، تعداد کارارکتر و مقدار آن را مشخص شده , و  آدرس های ۱۰۰۲ تا ۱۰۰۳ بیانگر این است که متغیری به نام str به آدرس حافظه ۲۰۰۱  که شامل یک رشته با مقدار hi میشود اشاره میکند

تخصیص حافظه در جاوا اسکریپت

در صورتیکه با call stack یا memeory stack آشنایی ندارید پیشنهاد میکنم به لینک زیر مراجعه کنید و با آن اشنا شوید

لینک مطالعه

garbage collector در جاوا اسکریپت

وظیفه  garbage collector به طور کلی این است که فضاهای بلااستفاده را پیدا و آزاد میکند و برای این کار از دو الگوریم Reference-counting و Mark-and-sweep استفاده میکند

Reference-Counting : در این الگو garbage collector هر شی ای که هیچ اشاره ای در حافظه به آن نشده باشد را از حافظه پاک میکند

به کد زیر توجه کنید


let user = {
  name: "John"
};

در اینجا متغیر user به شی {name:’john’} اشاره میکند

garbage-collector
حال اگر مقدار جدیدی به متغیر user تخصیص دهیم دیگر به شی قبلی اشاره نمیکند بنابراین {name:’john’} از حافظه پاک میشود


user = null;

garbage-collector

Mark-and-sweep : در این الگو garbage collector هر شی ای که در دسترس نباشد را از حافظه پاک میکند ، روش کار آن به این شکل است از متغیر های global  شروع به پیماش میکند و تمام اشیایی که به آنها اشاره شده پیدا میکند و آنقدر این کار را ادامه میدهد تا همه متغیر ها را پیمایش کند در انتها اشیایی از بالا به پایین دسترسی ای به آنها پیدا نشده از حافظه حذف میشوند

Mark-and-sweep

روش کار delete در جاوا اسکریپت

تابع delete میتواند اشاره به یک property در یک object را از بین ببرد ، نکته ای که وجود دارد این است که خود delete باعث حذف یک property نمیشود بلکه با از بین بردن اشاره وظیفه  garbage collector  آغاز شده و با استفاده از الگوریم refrence-counting شی ای که اشاره ای به آن نشده است را از حافظه پاک میکند برای درک این موضوع به کد زیر توجه کنید


let me = {
    nsme: {
        first :'abbas'
    }
}
let name =me.name

در اینجا متغیر me یک object است که شامل پروپرتی name میباشد و از طرفی me.name به متغیر name  تخصیص داده شده است، همانظور که در شکل میبینید هم متغیر name و هم متغیر me هر دو به شی first اشاره میکنند ، حال اگر با استفاده از delete me.name  ارتباط متغیر me را با شی first قطع میکنیم دقت کنید در اینجا چون هنوز متغیر name به شی first اشاره دارد garbage collector آن را از حافظه حذف نمیکند

delete-key-in-javascript