Fix "Garbage collection" (#123) by mahdiHash · Pull Request #124 · javascript-tutorial/fa.javascript.info
این مثال اهمیت زیاد مفهوم قابلیت دسترسی را نشان میدهد.
این واضح است که John و Ann هنوزم هم بهم پیوسته هستند و هر دو مرجعهای ورودی دارند. اما این کافی نیست. این واضح است که John و Ann هنوز هم بهم پیوسته هستند و هر دو مرجعهای ورودی دارند. اما این کافی نیست.
شیء سابق `"family"` از ریشه پیوندش را از دست داده است و دیگر هیچ مرجعی به آن وجود ندارد، پس تمام جزیره غیر قابل دسترس و پاک میشود.
## الگوریتم داخلی
الگوریتم پایهی جمعآوری زباله "علامت گذاری و جارو کردن" نامیده میشود. الگوریتم پایهی زبالهروبی "علامت گذاری و جارو کردن" نامیده میشود.
مراحل "جمعآوری زباله" پایین به طور منظم انجام میشوند:
- زباله جمعکن ریشهها را میگیرد و آنها را "علامت گذاری" میکند (به خاطر میسپارد). - سپس از تمام مرجعهای آنها بازدید میکند و آنها را "علامت گذاری میکند". - سپس از شیءهای علامت گذاری شده بازدید میکند و مرجعهای *آنها* را علامت گذاری میکند. تمام شیءهای بازدید شده به خاطر سپرده میشوند تا در آینده دوباره از شیء یکسانی بازدید نشود. - ...و این فرایند تا زمانی که از تمام مرجعهای قابل دسترس (از ریشهها) بازدید شود. - ...و این فرایند تا زمانی که از تمام مرجعهای قابل دسترس (از ریشهها) بازدید شود ادامه پیدا میکند. - تمام شیءها به جز آنهایی که علامت گذاری شدهاند پاک میشوند.
برای مثال، بیایید فرض کنیم ساختار شیء ما اینگونه باشد:
همچنین میتوانیم فرایند را اینگونه فرض کنیم که یک سطل رنگ بسیار بزرگ از ریشه ریخته میشود که بین تمام مرجعها جریان مییابد و تمام شیءهای قابل دسترس را علامت گذاری میکند. سپس شیءهایی که علامت گذاری نشدهاند پاک میشوند.
این مفهوم کلی چگونگی کار کردن جمعآوری زباله است. موتورهای جاوااسکریپت بهینهسازیهای زیادی را اعمال میکنند تا آن را سریعتر کنند و روی اجراشدن برنامه تاثیری نگذارد. این مفهوم کلی چگونگی کار کردن زبالهروبی است. موتورهای جاوااسکریپت بهینهسازیهای زیادی را اعمال میکنند تا آن را سریعتر کنند و روی اجراشدن برنامه تاثیری نگذارد.
بعضی از بهینهسازیها:
- **جمعآوری نسلی** -- شیءها به دو دسته تقسیم میشوند: "جدیدها" و " قدیمیها". بسیاری از شیءها به وجود میآیند، کارشان را انجام میدهند و به سرعت میمیرند، آنها میتوانند به سرعت پاک میشوند. شیءهایی که برای مدت زیاد باقی میمانند، "قدیمی" میشوند و کمتر بررسی میشوند. - **جمعآوری افزایشی** -- اگر شیءهای زیادی وجود داشته باشند و ما تلاش کنیم که یک باره برویم و تمام دسته شیء را علامت گذاری کنیم، ممکن است این کار زمان ببرد و اختلالهای قابل رویت را در اجرا ایجاد کند. پس موتور سعی میکند که جمعآوری زباله را به چند بخش تقسیم کند. سپس هر بخش یکی یکی به صورت جداگانه انجام میشود. این کار برای دنبال کردن تغییرات به ثبت کردن بیشتری نیاز دارد، اما ما به جای اختلالی بزرگ اختلالهای خیلی کوچک را خواهیم داشت. - **جمعآوری زمان بیکاری** -- زباله جمعکن سعی میکند که فقط زمانی که پردازنده (CPU) بیکار است کار خود را انجام دهد تا تاثیر ممکن روی اجراشدن را کاهش دهد.
بهینهسازی و روشهای دیگری هم برای الگوریتمهای جمعآوری زباله وجود دارد. همان قدر که دوست دارم آنها را اینجا توضیح دهم، نباید ادامه دهم، چون موتورهای مختلف تکنیک و فنهای مختلفی را پیادهسازی میکنند. و این حتی مهم تر است که همانطور که موتورهای پیشرفت میکنند چیزهایی هم تغییر میکنند، پس مطالعهی عمیقتر "پیشرفته" بدون نیاز واقعی احتمالا نمیارزد. مگر اینکه، موضوع کاملا مربوط به علاقه باشد که در این صورت لینکهایی برای شما در پایین قرار داده شده است. بهینهسازی و روشهای دیگری هم برای الگوریتمهای زبالهروبی وجود دارد. همان قدر که دوست دارم آنها را اینجا توضیح دهم، نباید ادامه دهم، چون موتورهای مختلف تکنیک و فنهای مختلفی را پیادهسازی میکنند. و این حتی مهم تر است که همانطور که موتورها پیشرفت میکنند چیزهایی هم تغییر میکنند، پس مطالعهی عمیقتر "پیشرفته" بدون نیاز واقعی احتمالا ارزش ندارد. مگر اینکه، موضوع کاملا مربوط به علاقه باشد که در این صورت لینکهایی برای شما در پایین قرار داده شده است.
## خلاصه
چیزهای مهم که باید بدانیم:
- جمعآوری زباله به صورت خودکار انجام میشود. ما نمیتوانیم آن را مجبور یا از آن جلوگیری کنیم. - زبالهروبی به صورت خودکار انجام میشود. ما نمیتوانیم آن را مجبور یا از آن جلوگیری کنیم. - شیءها تا زمانی که قابل دسترس باشند در حافظه باقی میمانند. - مرجع بودن با قابل دسترس بودن (از یک ریشه) یکسان نیست : یک دستهی شیءهای بهم پیوسته میتوانند به طور کامل غیر قابل دسترس شوند.
موتورهای مدرن الگوریتمهای پیشرفتهی جمعآوری زباله را پیادهسازی میکنند. موتورهای مدرن الگوریتمهای پیشرفتهی زبالهروبی را پیادهسازی میکنند.
کتاب کلی "The Garbage Collection Handbook: The Art of Automatic Memory Management" (R. Jones و بقیه افراد) بعضی از آنها را پوشش میدهد.
اگر شما با برنامهنویسی سطح پایین آشنایی دارید، اطلاعاتی با جزییات درباره زبالهروبی V8 در این مقاله است [A tour of V8: Garbage Collection](http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection).
[V8 بلاگ](https://v8.dev/) هم هر چند گاهی مقالههایی درباره تغییرات مدیریت حافظه منتشر میکند. طبیعتا، برای یادگیری جمعآوری زباله، شما بهتر است به طور کلی با یاد گرفتن چیزهای داخلی V8 آماده شوید و بلاگ [Vyacheslav Egorov](http://mrale.ph) که یکی از مهندسهای V8 بود را بخوانید. من میگویم: "V8" چون مقالههای زیادی درباره آن در اینترنت وجود دارد. برای موتورهای دیگر، بیشتر روشها مشابه هستند، اما جمعآوری زباله در جنبههای زیادی متفاوت است. [بلاگ V8](https://v8.dev/) هم هر چند گاهی مقالههایی درباره تغییرات مدیریت حافظه منتشر میکند. طبیعتا، برای یادگیری زبالهروبی، شما بهتر است به طور کلی با یاد گرفتن چیزهای داخلی V8 آماده شوید و بلاگ [Vyacheslav Egorov](http://mrale.ph) که یکی از مهندسهای V8 بود را بخوانید. من میگویم: "V8" چون مقالههای زیادی درباره آن در اینترنت وجود دارد. برای موتورهای دیگر، بیشتر روشها مشابه هستند، اما زبالهروبی در جنبههای زیادی متفاوت است.
اگر شما بهینهسازیهای سطح پایین را نیاز دارید، دانایی عمیق موتورها چیز خوبی است. این کار عاقلانهای است که بعد از آشنایی با زبان برای آن برنامهریزی کنید.