برنامه نویسی

Spiderjs 🕷 | در جاوا اسکریپت با پشته و حافظه تماس بگیرید

1. مقدمه ای برای تماس با پشته و حافظه پشته

پس از کاوش در محیط اجرا JavaScript و سفر V8 Engine به کد ماشین ، اکنون به ساختارهای داده مدیریت اجرای کد نگاه می کنیم: پشته تماس وت پشته حافظهبشر آنها برای درک چگونگی عملکرد JavaScript عملکرد و حافظه مهم هستند.

پشته تماس چیست؟

در پشته تماس اجرای عملکرد در JavaScript با استفاده از a Last In ، First Out (Lifo) ساختار هنگامی که یک تابع خوانده می شود ، a قاب پشته با جزئیاتی مانند متغیرهای محلی و آدرس بازگشت ایجاد شده است. ابتدایی (به عنوان مثال ، اعداد ، رشته ها) به طور مستقیم در قاب پشته ذخیره می شوند ، در حالی که اشاراتی به غیر پیش بینی ها (به عنوان مثال اشیاء) به حافظه حافظه اشاره می کند. پس از اتمام عملکرد ، قاب آن برداشته می شود و اجرای آن به عملکرد قبلی باز می گردد.

پشته حافظه چیست؟

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


2. سفر کد از طریق پشته تماس و حافظه

بیایید بررسی کنیم که چگونه کد جاوا اسکریپت با پشته تماس و حافظه در طی دو مرحله کلیدی تعامل دارد: تخصیص و اجرای.

سفر کد: تخصیص و اجرای

تخصیص: هنگامی که کد JavaScript اجرا می شود ، موتور V8 حافظه را اختصاص می دهد. ابتدایی (به عنوان مثال ، اعداد) در قاب های پشته Call Stack ذخیره می شوند ، در حالی که غیر پیش بینی ها (به عنوان مثال اشیاء) در پشته حافظه اختصاص می یابد ، با منابع ذخیره شده در قاب های پشته. تعاریف عملکرد آماده شده است اما هنوز اجرا نشده است.

اعدام: Call Stack اجرای عملکرد را مدیریت می کند. هنگامی که یک تابع فراخوانی می شود ، آن را به پشته فشار می دهد. موتور عملکرد را اجرا می کند و از طریق منابع پشته به طور مستقیم از پشته و غیر پیش بینی ها دسترسی پیدا می کند. پس از اتمام عملکرد ، آن را خاموش می کند و کنترل را به عملکرد قبلی باز می گرداند.

نمونه

function greet() {
  let message = "Hello!"; // Primitive: stored in Call Stack
  return message;
}
function start() {
  let result = greet(); // Primitive: stored in Call Stack
  let obj = { text: result }; // Non-primitive: stored in Heap, reference in Call Stack
  console.log(obj.text);
}
start();
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • تخصیص: message وت result (رشته ها) در فریم های پشته تماس اختصاص داده می شوند. obj (یک شی) در پشته ، با مرجع آن در start() قاب
  • اعدام: start() به پشته تماس و سپس تماس گرفته می شود greet()، که در بالا هل داده می شود. greet() “سلام!” و از بین می رود. start() ایجاد کردن obj، آن را ثبت می کند text املاک (از طریق مرجع پشته قابل دسترسی است) ، و از بین می رود و پشته را خالی می کند.

3. سرریز پشته ، جمع آوری زباله و نشت حافظه

حال بیایید به موضوعات متداول با پشته تماس و حافظه ، از جمله سرریز پشته ، جمع آوری زباله و نشت حافظه بپردازیم.

سناریوهای سرریز پشته

بوها سرریز پشته هنگامی اتفاق می افتد که پشته تماس بیش از حد اندازه خود باشد ، اغلب به دلیل بازگشت بی نهایت. به عنوان مثال ، تابعی که خود را بدون شرایط توقف صدا می کند ، باعث اضافه شدن قاب های پشته تا سرریز پشته می شود و باعث خرابی می شود.

جمع آوری زباله در پشته

مجموعه زباله ها فرآیند V8 برای مدیریت پشته حافظه است. این اشیاء را مشخص می کند که دیگر توسط کد ارجاع نمی شوند و حافظه آنها را آزاد می کنند و باعث رشد بیش از حد پشته می شوند. V8 از یک رویکرد نسلی استفاده می کند و اشیاء را برای پاکسازی کارآمد به فضاهای “جوان” و “قدیمی” تقسیم می کند.

نشت حافظه چیست؟

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

نمونه

function recursive() {
  recursive(); // Infinite recursion causes stack overflow
}
recursive();

let leakyArray = [];
function leak() {
  leakyArray.push(new Array(1000)); // Keeps adding, causing a memory leak
}
setInterval(leak, 1000); // Runs repeatedly
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • سرریز پشته: recursive() با افزودن بی پایان قاب های پشته ، باعث سرریز پشته می شود.
  • نشت حافظه: leakyArray به طور نامحدود رشد می کند ، زیرا مرجع آن از جمع آوری زباله جلوگیری می کند.

منابع

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا