نشت حافظه Memory Leak یکی از مشکلات رایج در برنامه نویسی موبایل است که می تواند منجر به عملکرد ضعیف، مصرف زیاد انرژی و حتی خرابی برنامه شود. یکی از مهارت هایی که به عنوان برنامه نویس فلاتر لازم است تا به آن دقت کنید مدیریت صحیح حافظه میباشد.
در این پست، به بررسی مفهوم نشت حافظه و نحوه جلوگیری از آن در برنامه نویسی موبایل می پردازیم.
نشت حافظه به وضعیتی گفته می شود که یک شیء در حافظه باقی می ماند، حتی اگر دیگر مورد نیاز نباشد.
به بیان دیگر مشکل نشت حافظه در فلاتر مواقعی میتواند رخ دهد که نگهداری مقادیر زیادی اطلاعات در حافظه باعث مصرف بیش اندازه آن میشود.
در فلاتر، ماشین مجازی زبان دارت VM مدیریت حافظه را بر عهده دارد و از یک garbage collector برای بازیابی خودکار حافظه استفاده نشده استفاده میکند.
با این حال، اگر اشیا به طور کافی از حافظه آزاد نشوند، ممکن است نشت حافظه رخ دهد که منجر به ماندگاری آنها در Heap و مصرف منابع غیر ضروری میشود.
این اتفاقات میتواند نتیجه نگهداری غیر اصولی اطلاعات کش, حذف اطلاعات به شکل نامناسب از حافظه, بی توجهی به پاک کردن Listenerها و موارد دیگر باشد.
مدیریت نادرست استریم ها و رویدادهای asynchronous در صورتی که subscriptions یک استریم به درستی بسته نشود در پس زمینه به حیات خود ادامه میدهد و باعث نشت حافظه میشود.
مورد دیگر که میتواند در این قضیه تاثیر داشته باشد استفاده از تصاویر و فایل های ویدیویی با حجم بالا بدون آزاد سازی صحیح حافظه میباشد.
برای جلوگیری از وقوع این اتفاق شما به عنوان برنامه نویس فلاتر و توسعه دهنده اپلیکیشن مجموعه اقداماتی را میتوانید انجام دهید.
حذف صحیح اشیا
همواره اشیا را زمانی که دیگر مورد نیاز نیستند با استفاده از متد dispose در ویجت حذف کنید.
این کار اطمینان میدهد که هرگونه منابع مرتبط با شیء آزاد شده و از مصرف غیرضروری حافظه جلوگیری میشود.
استفاده از صحیح از استریم
برای جلوگیری از نشت حافظه ناشی از استریم ها، همواره زمانی که دیگر به Stream نیازی نیست، اشتراک آن را لغو کنید. این کار اطمینان میدهد که استریم در پسزمینه فعال باقی نمانده و حافظه را مصرف نمیکند.
استفاده از صحیح از مدیا
برای جلوگیری از نشت حافظه ناشی از تصاویر و ویدئوی های بزرگ، از تکنیکهای کارآمد برای بارگذاری آنها استفاده کنید.
یکی از این تکنیکها استفاده از بسته “flutter_cache_manager” است که به ذخیرهسازی تصاویر و ویدئوها در حافظه کش کمک میکند و میزان حافظه مصرفی آنها را کاهش میدهد.
پیاده سازی قابلیت کش Cache اطلاعات در فلاتر
استفاده از قابلیت های Profile
ابزارهای پروفایلسازی مانند Flutter DevTools میتوانند به شناسایی نشت حافظه در برنامه شما کمک کنند.
با تجزیه و تحلیل مصرف حافظه برنامه خود، میتوانید نواحی که باعث نشت حافظه میشوند را شناسایی کرده و اقدامات لازم برای رفع آنها را انجام دهید.
برای اینکه بتوانید نشت حافظه را در اپلیکیشن تشخیص دهید فریمورک فلاتر ابزارهای مختلفی و در اختیار شما قرار داده است.
استفاده از DevTools
از ابزار DevTools، که یک ابزار عملکردی و اشکالزدایی است، برای بررسی مصرف حافظه برنامه خود استفاده کنید. میتوانید با استفاده از دستور flutter pub global run devtools به آن دسترسی داشته باشید.
بررسی حافظه Heap
حافظه Heap یک نوع حافظه پویا است که در بسیاری از زبان های برنامه نویسی از آن استفاده میشود. برای بررسی موارد مصرف حافظه میتوانید عملکرد این حافظه را با تهیه SnapShot در یک لحظه بررسی کنید.
با آنالیز این اطلاعات میتوانید مواردی از آبجکت ها به انتظار میرفت به وسیله GC پاک شوند اما هنوز داخل حافظه هستند را مشاهده کنید.
نمودار مرور حافظه، نمودار سری زمانی از آمار حافظه جمعآوریشده است. این نمودار وضعیت هیپ Dart یا Flutter و حافظه بومی Dart یا Flutter را در طول زمان به صورت بصری نمایش میدهد.
محور افقی (x) نمودار، یک جدول زمانی از رویدادها (سری زمانی) است. دادههای رسم شده در محور عمودی (y) همگی دارای یک برچسب زمانی هستند که نشان میدهد دادهها در چه زمانی جمعآوری شدهاند.
مقدار عمودی نمودار هم نمایش دهنده میزان حافظه مصرف شده میباشد.
به عبارت دیگر، این نمودار وضعیت حافظه (ظرفیت، استفادهشده، خارجی، RSS (اندازه مجموعه ساکن) و GC را هر 500 میلیثانیه نشان میدهد. این امر به ارائه یک نمای زنده از وضعیت حافظه در حین اجرای برنامه کمک میکند.
نکات کلیدی:
اما بخش های مختلف تصویر را اگر بخواهیم بصورت مختصر بررسی کنیم به صورت زیر میباشد.
Dart/Flutter Native
حافظهای که در هیپ Dart/Flutter نیست، اما همچنان بخشی از کل حافظه مصرفی برنامه محسوب میشود.
اشیا موجود در این نوع حافظه، اشیای Native هستند (به عنوان مثال، اشیایی که از خواندن یک فایل در حافظه یا یک تصویر رمزگشاییشده ایجاد میشوند). اشیای Native از طریق یک تعبیه کننده(embedder) زبان دارت، از سیستمعامل Native مانند اندروید، لینوکس، ویندوز، iOS در دسترس ماشین مجازی زبان دارت قرار میگیرند.
Allocated
ظرفیت فعلی هیپ به طور معمول کمی بیشتر از مجموع اندازه تمام اشیاء هیپ است.
RSS – Resident Set Size
اندازه مجموعه مقیم (Resident Set Size) میزان حافظه مورد استفاده یک فرآیند را نشان میدهد. این میزان، حافظهای را که به فضای Swap منتقل شده است شامل نمیشود.
این مقدار، حافظه مربوط به کتابخانههای مشترک بارگذاریشده و همچنین تمام حافظه پشته (stack) و هیپ (heap) را در برمیگیرد.
بخشی از رم که در واقع توسط یک اپلیکیشن اشغال شده است، بهعنوان Resident Set Size یا بهاختصار RSS نامیده میشود.
حافظه swap شده: بخشی از حافظه فرآیند است که به طور موقت به دیسک منتقل شده است تا فضای RAM برای فرآیندهای دیگر آزاد شود.
گیتهاب اکشن GitHub Actions یکی از ابزارهای گیتهاب است که به شما کمک میکنه تا…
اگر یک برنامه نویس فلاتر هستید و با از نسخه وب اپلیکیشن پروژتون استفاده میکنید…
به عنوان یک برنامه نویس فلاتر یا اندروید بعد از اتمام پروسه طراحی اپلیکیشن نیاز…
طراحی رابط کاربری اپلیکیشن پادکست خود را با استفاده از این کیت توسعه UI/UX فلاتر…
فایربیس، پلتفرمی قدرتمند از شرکت گوگل برای توسعه و مدیریت برنامههای موبایل و وب است.…
فلاتر یک فریم ورک برنامه نویسی چندسکویی است که این امکان را برای برنامه نویس…