رفتن به محتوای اصلی
Koohestun
توضیح کوهستانمدیریت حافظهگزارش تحلیلی· 5 دقیقه مطالعه· در فناوری

توقف دنیا: زباله‌روب‌های نسلی چگونه توان عملیاتی و تاخیر را در زمان اجرای برنامه‌ها متعادل می‌کنند؟

محیط‌های اجرای مدرن برای بازپس‌گیری خودکار حافظه به زباله‌روب‌های نسلی متکی هستند؛ سیستمی که با دسته‌بندی اشیاء بر اساس سن، اختلال در عملکرد را به حداقل می‌رساند. با این حال، بده‌بستان بنیادین میان به حداکثر رساندن توان پردازشی کل و به حداقل رساندن وقفه‌های تاخیری موسوم به «توقف دنیا» همچنان یک محدودیت سخت مهندسی باقی مانده است.

به قلم آیدا امینی

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

دیدگاه‌هایی که این گزارش پوشش نداده

  • مهندسان سیستم‌های نهفته که با محدودیت‌های سخت و بی‌درنگ دست‌وپنج نرم می‌کنند
  • ارائه‌دهندگان زیرساخت‌های ابری که هزینه مجموع پردازشگر برای زباله‌روبی را مدیریت می‌کنند

نکات کلیدی

  • زباله‌روب‌های نسلی، حافظه را به فضاهای «جوان» و «پیر» تقسیم می‌کنند تا کارایی پاک‌سازی را بهینه کنند.
  • این استراتژی بر این واقعیت استوار است که بیشتر اشیاء داده‌ای موقتی هستند و می‌توانند تقریبا بلافاصله حذف شوند.
  • جابه‌جایی اشیاء در حافظه نیازمند یک وقفه «توقف دنیا» است که در آن برنامه موقتا فریز می‌شود.
  • مهندسان باید بین به حداکثر رساندن توان عملیاتی کل یا به حداقل رساندن وقفه‌های تاخیری یکی را انتخاب کنند.
  • زباله‌روب‌های مدرنی مانند زدجی‌سی با اجرای همزمان، وقفه‌ها را به زیر یک میلی‌ثانیه رسانده‌اند و در ازای پاسخ‌گویی بهتر، بار پردازشی پردازنده را افزایش می‌دهند.
80-98%
اشیائی که تقریبا بلافاصله از بین می‌روند
200 ms
هدف پیش‌فرض وقفه برای جی‌وان
< 1 ms
هدف وقفه برای زدجی‌سی و شنندوا

چرا مهم است

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

زباله‌روب‌های نسلی با تقسیم حافظه برنامه به فضاهای «جوان» و «پیر»، توان عملیاتی و تاخیر را متعادل می‌کنند. این سیستم‌ها بر این فرض آماری استوارند که بیشتر اشیاء داده‌ای تقریبا بلافاصله پس از ایجاد از بین می‌روند. محیط‌های اجرا با پاک‌سازی مکرر فضای کوچک جوان و توقف‌های نادر کل برنامه برای پاک‌سازی فضای پیر، تلاش می‌کنند تا کل کار انجام‌شده را به حداکثر برسانند؛ در حالی که فریزهای اجتناب‌ناپذیر «توقف دنیا» را آن‌قدر کوتاه نگه می‌دارند که کاربران هرگز متوجه آن‌ها نشوند.[1][7]

هر زبان مدیریت‌شده مدرنی، از جاوا و سی‌شارپ گرفته تا پایتون و گو، با یک محدودیت فیزیکی یکسان روبه‌رو است: حافظه محدود است. وقتی یک برنامه ساختارهای داده‌ای جدیدی ایجاد می‌کند، رم مصرف می‌شود. وقتی دیگر به آن ساختارها نیازی نیست، آن حافظه باید پس گرفته شود. انجام خودکار این کار از نشت فاجعه‌بار حافظه جلوگیری می‌کند، اما این حسابرسی نیازمند چرخه‌های پردازشی است که در غیر این صورت می‌توانستند منطق تجاری اصلی برنامه را اجرا کنند.[3]

پایه و اساس مدیریت حافظه مدرن بر مفهومی استوار است که در پژوهش‌های آکادمیک اولیه، از جمله کار روی زبان برنامه‌نویسی سلف در دانشگاه استنفورد در سال ۱۹۸۴، فرموله شد. این اصل به عنوان «فرضیه نسل ضعیف» شناخته می‌شود. همان‌طور که مستندات سال ۲۰۲۶ اوراکل به سادگی ادعا می‌کند: «فرضیه نسل ضعیف بیان می‌کند که بیشتر اشیاء تنها برای مدت کوتاهی زنده می‌مانند.»[1][6]

در عمل، اندازه‌گیری‌های تجربی نشان می‌دهند که بین ۸۰ تا ۹۸ درصد از تمام اشیاء جدید تخصیص‌یافته در یک وب‌اپلیکیشن معمولی، در عرض چند میلی‌ثانیه غیرقابل دسترس می‌شوند. آن‌ها متغیرهای موقتی، شمارنده‌های حلقه یا داده‌های میانی درخواست‌ها هستند که هدف کوتاه‌مدتی برای رندر کردن یک صفحه وب یا پردازش یک فراخوانی ای‌پی‌آی دارند و بلافاصله دور ریخته می‌شوند.[1][5]

برای بهره‌برداری از این واقعیت آماری، زباله‌روب‌های نسلی، پشته حافظه را به مناطق مجزایی تقسیم می‌کنند. «نسل جوان» جایی است که تمام اشیاء جدید در آن متولد می‌شوند و معمولا کار خود را در ناحیه‌ای به نام «بهشت» آغاز می‌کنند. از آنجا که محیط اجرا انتظار دارد بیشتر این اشیاء به سرعت از بین بروند، اجازه می‌دهد فضای بهشت به سرعت پر شود، بدون اینکه هیچ پاک‌سازی فوری یا بار رهگیری اضافه‌ای اعمال کند.[1]

حافظه پشته‌ای نسلی، حافظه را بر اساس سن اشیاء داده‌ای به مناطق مجزا تقسیم می‌کند.

وقتی ظرفیت فضای بهشت تکمیل می‌شود، محیط اجرا یک «زباله‌روبی جزئی» را آغاز می‌کند. در طول این فاز، زباله‌روب کسر کوچکی از اشیائی را که هنوز زنده‌اند شناسایی کرده و آن‌ها را به یک فضای مجزای «بازماندگان» کپی می‌کند. سپس کل فضای بهشت در یک عملیات واحد و بسیار کارآمد خالی اعلام می‌شود و نیازی به حذف تک‌تک میلیون‌ها شیء مرده نیست.[1][2]

وقتی ظرفیت فضای بهشت تکمیل می‌شود، محیط اجرا یک «زباله‌روبی جزئی» را آغاز می‌کند.

با این حال، این کارایی با یک هزینه مکانیکی سنگین همراه است. همان‌طور که مستندات توسعه‌دهندگان ردهت توضیح می‌دهد: «تمام زباله‌روبی‌های جزئی رویدادهای توقف دنیا هستند.» برای جابه‌جایی ایمن اشیاء در حافظه بدون اینکه برنامه به طور تصادفی از یک آدرس حافظه قدیمی و نامعتبر بخواند، محیط اجرا باید تمام رشته‌های برنامه را کاملا متوقف کند.[2]

برای یک لحظه کوتاه، برنامه از کار می‌افتد. نمی‌تواند درخواست‌های وب را پردازش کند، نمی‌تواند رابط کاربری را به‌روزرسانی کند و نمی‌تواند به پینگ‌های شبکه پاسخ دهد. در یک سیستم که به خوبی تنظیم شده باشد، این وقفه تنها چند میلی‌ثانیه طول می‌کشد؛ آن‌قدر سریع که یک کاربر انسانی، یا حتی یک متعادل‌کننده بار، هرگز متوجه این وقفه نمی‌شود.[2][5]

اشیائی که از چندین چرخه زباله‌روبی جزئی جان سالم به در می‌برند، در نهایت به «نسل قدیمی» یا فضای تثبیت‌شده ارتقا می‌یابند. این ناحیه داده‌های با عمر طولانی را نگه می‌دارد: پیکربندی‌های برنامه، رکوردهای کش‌شده پایگاه داده و وضعیت‌های فعال نشست کاربر. از آنجا که نسل قدیمی بسیار بزرگ‌تر از نسل جوان است، با سرعت بسیار کمتری پر می‌شود.[1][3]

وقتی نسل قدیمی در نهایت پر می‌شود، محیط اجرا باید یک «زباله‌روبی اصلی» انجام دهد. از نظر تاریخی، این کار نیازمند توقف برنامه برای کل مدت زمان پاک‌سازی و اسکن گیگابایت‌ها حافظه بود. در سال ۲۰۱۱، این وقفه‌های زباله‌روبی اصلی به راحتی می‌توانستند یک برنامه سازمانی را برای چند ثانیه فریز کنند و باعث قطعی شبکه و افت تجربه کاربری شوند.[2][3]

این پویایی، مهندسان را مجبور می‌کند بین دو معیار رقیب یکی را انتخاب کنند: توان عملیاتی و تاخیر. توان عملیاتی، کل مقدار کار مفیدی را که یک برنامه در یک دوره طولانی انجام می‌دهد، اندازه‌گیری می‌کند. تاخیر، حداکثر زمانی را که یک عملیات واحد برای تکمیل شدن نیاز دارد، می‌سنجد. همان‌طور که راهنمای عملکرد سال ۲۰۲۵ جاواپرو به تفصیل بیان می‌کند، بهینه‌سازی برای یکی، ذاتا دیگری را تضعیف می‌کند.[5]

کاهش وقفه‌های «توقف دنیا» نیازمند اختصاص توان پردازشی پیوسته بیشتری از پردازنده به مدیریت پس‌زمینه حافظه است.

یک زباله‌روب بهینه‌شده برای توان عملیاتی، عملکرد برنامه را با اجرای نادر زباله‌روبی به حداکثر می‌رساند؛ اما وقتی اجرا می‌شود، از تمام هسته‌های در دسترس پردازنده برای اتمام کار استفاده می‌کند که باعث یک وقفه محسوس می‌شود. در مقابل، یک زباله‌روب بهینه‌شده برای تاخیر، تقریبا به طور پیوسته در پس‌زمینه اجرا می‌شود و ۱۰ تا ۱۵ درصد از ظرفیت کل پردازنده را می‌دزدد تا تضمین کند برنامه هرگز بیش از کسری از میلی‌ثانیه متوقف نمی‌شود.[4][5]

محیط‌های اجرای مدرن به طور فزاینده‌ای بهینه‌سازی تاخیر را به عنوان پیش‌فرض انتخاب کرده‌اند که بازتابی از تغییر رویه به سمت میکروسرویس‌ها و رابط‌های برنامه‌نویسی بی‌درنگ است. زباله‌روب جی‌وان که به پیش‌فرض جاوا تبدیل شد، با یک هدف سخت‌گیرانه کار می‌کند: تلاش می‌کند وقفه‌ها را زیر یک آستانه تعریف‌شده توسط کاربر، معمولا ۲۰۰ میلی‌ثانیه، نگه دارد. این کار را با شکستن پشته به مناطق کوچک‌تر و جمع‌آوری مناطقی که بیشترین زباله را دارند انجام می‌دهد.[4]

لبه تکنولوژی در این حوزه، که با زباله‌روب‌هایی مانند زدجی‌سی و شنندوا نمایندگی می‌شود، مرزها را فراتر می‌برد. این زباله‌روب‌ها با استفاده از تکنیک‌های پیشرفته‌ای مانند اشاره‌گرهای حافظه رنگی و موانع بارگذاری، تقریبا تمام کار خود را به صورت همزمان و در حالی که برنامه در حال اجراست انجام می‌دهند. آن‌ها به طور معمول به زمان‌های وقفه کمتر از یک میلی‌ثانیه دست می‌یابند و عملا مشکل «توقف دنیا» را برای همه محیط‌ها، به جز محیط‌های دارای محدودیت شدید سخت‌افزاری، حل‌شده جلوه می‌دهند.[4][7]

زباله‌روب‌های همزمان مدرن، حداکثر زمان وقفه را از چند ثانیه به زیر یک میلی‌ثانیه کاهش داده‌اند.

اصطلاحات کلیدی

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

منابع

پوشش منابع

7 منبع

3 دیدگاه شناسایی‌شده

حداقل‌کنندگان تاخیر 45%بهینه‌سازان توان عملیاتی 35%طرفداران حافظه دستی 20%
  1. [1]Oracle

    Java Garbage Collection Basics

    مطالعه در Oracle
  2. [2]Red Hat Developerحداقل‌کنندگان تاخیر

    Stages and levels of Java garbage collection

    مطالعه در Red Hat Developer
  3. [3]worldmodscode

    Practical Garbage Collection, part 1 – Introduction

    مطالعه در worldmodscode
  4. [4]Site24x7حداقل‌کنندگان تاخیر

    Choosing the Right Java Garbage Collector (G1, ZGC, Shenandoah)

    مطالعه در Site24x7
  5. [5]JAVAPRO Internationalبهینه‌سازان توان عملیاتی

    Hitchhiker's Guide to Java Performance

    مطالعه در JAVAPRO International
  6. [6]Stanford University

    Adaptive optimization for Self: Reconciling high performance with exploratory programming

    مطالعه در Stanford University
  7. [7]تیم سردبیری کوهستان

    تحلیل تیم سردبیری کوهستان

    مطالعه در تیم سردبیری کوهستان

نظرات

همیشه در جریان باشید

هر زاویه. هر روز.

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