اول از همه باید مشخص کنید حافظه واقعاً آزاد نمیشود یا فقط مصرفش موقتاً بالا میرود. برای پیدا کردن Memory Leak معمولاً این مسیر جواب میدهد:
برنامه را باز کنید و یک سناریوی مشخص را چند بار تکرار کنید؛ مثلاً رفتوبرگشت بین دو صفحه. بعد با ابزارهایی مثل Chrome DevTools Memory/Heap Snapshot یا در اپهای native با Profiler، چند بار از Heap Snapshot بگیرید و ببینید بعد از انجام و خروج از آن صفحه، آبجکتهایی که باید حذف شده باشند هنوز در حافظه ماندهاند یا نه.
اگر یک آبجکت چند بار ساخته میشود ولی بعد از خروج صفحه تعدادش کم نمیشود، معمولاً یک reference جایی نگه داشته شده. در React مواردی مثل useEffect بدون cleanup، event listenerها، timerها، WebSocket، subscription، cacheهای بدون محدودیت و نگه داشتن دادههای بزرگ در state از متهمهای رایج هستند.
مثلاً اگر این را داشته باشید:
useEffect(() => {
window.addEventListener("resize", handleResize);
}, []);
ولی removeEventListener نداشته باشید، با هر بار mount شدن کامپوننت یک listener جدید اضافه میشود.
پس دنبال این الگو باشید:
تکرار سناریو → گرفتن Snapshot → مقایسه Snapshotها → پیدا کردن آبجکتهایی که بعد از خروج هنوز باقی ماندهاند → بررسی reference و cleanup
نکته مهم اینه که اگر مصرف حافظه بالا میره ولی بعد از مدتی Garbage Collection آن را پایین میآورد، لزوماً Memory Leak ندارید؛ مشکل زمانی جدیتره که حافظه بعد از GC هم بهصورت پیوسته بالا بمونه.
هنوز پاسخی ثبت نشده
نظرها