فلاتر

نشت حافظه در فلاتر Memory leak و روش های جلوگیری از آن

نشت حافظه Memory Leak یکی از مشکلات رایج در برنامه نویسی موبایل است که می تواند منجر به عملکرد ضعیف، مصرف زیاد انرژی و حتی خرابی برنامه شود. یکی از مهارت هایی که به عنوان برنامه نویس فلاتر لازم است تا به آن دقت کنید مدیریت صحیح حافظه میباشد.

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

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

نشت حافظه به وضعیتی گفته می شود که یک شیء در حافظه باقی می ماند، حتی اگر دیگر مورد نیاز نباشد.

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

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

با این حال، اگر اشیا به طور کافی از حافظه آزاد نشوند، ممکن است نشت حافظه رخ دهد که منجر به ماندگاری آنها در Heap و مصرف منابع غیر ضروری می‌شود.

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

مدیریت نادرست استریم ها و رویدادهای asynchronous در صورتی که subscriptions یک استریم به درستی بسته نشود در پس زمینه به حیات خود ادامه میدهد و باعث نشت حافظه میشود.

مورد دیگر که میتواند در این قضیه تاثیر داشته باشد استفاده از تصاویر و فایل های ویدیویی با حجم بالا بدون آزاد سازی صحیح حافظه میباشد.

آموزش جلوگیری از Memory leak در فلاتر

برای جلوگیری از وقوع این اتفاق شما به عنوان برنامه نویس فلاتر و توسعه دهنده اپلیکیشن مجموعه اقداماتی را میتوانید انجام دهید.

حذف صحیح اشیا

همواره اشیا را زمانی که دیگر مورد نیاز نیستند با استفاده از متد dispose در ویجت حذف کنید.

این کار اطمینان می‌دهد که هرگونه منابع مرتبط با شیء آزاد شده و از مصرف غیرضروری حافظه جلوگیری می‌شود.

استفاده از صحیح از استریم

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

استفاده از صحیح از مدیا

برای جلوگیری از نشت حافظه ناشی از تصاویر و ویدئوی های بزرگ، از تکنیک‌های کارآمد برای بارگذاری آن‌ها استفاده کنید.

یکی از این تکنیک‌ها استفاده از بسته “flutter_cache_manager” است که به ذخیره‌سازی تصاویر و ویدئوها در حافظه کش کمک می‌کند و میزان حافظه مصرفی آن‌ها را کاهش می‌دهد.

استفاده از قابلیت های Profile

ابزارهای پروفایل‌سازی مانند Flutter DevTools می‌توانند به شناسایی نشت حافظه در برنامه شما کمک کنند.

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

روش های تشخیص نشت حافظه

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

استفاده از DevTools

از ابزار DevTools، که یک ابزار عملکردی و اشکال‌زدایی است، برای بررسی مصرف حافظه برنامه خود استفاده کنید. می‌توانید با استفاده از دستور flutter pub global run devtools به آن دسترسی داشته باشید.

بررسی حافظه Heap

حافظه Heap یک نوع حافظه پویا است که در بسیاری از زبان های برنامه نویسی از آن استفاده میشود. برای بررسی موارد مصرف حافظه میتوانید عملکرد این حافظه را با تهیه SnapShot در یک لحظه بررسی کنید.

با آنالیز این اطلاعات میتوانید مواردی از آبجکت ها به انتظار میرفت به وسیله GC پاک شوند اما هنوز داخل حافظه هستند را مشاهده کنید.


بررسی DevTools

نمودار مرور حافظه، نمودار سری زمانی از آمار حافظه جمع‌آوری‌شده است. این نمودار وضعیت هیپ 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 برای فرآیندهای دیگر آزاد شود.

Hesam

Recent Posts

گیتهاب اکشن چیست؟ آموزش استفاده از گیتهاب اکشن در برنامه نویسی فلاتر

گیتهاب اکشن GitHub Actions یکی از ابزارهای گیتهاب است که به شما کمک می‌کنه تا…

6 روز ago

آموزش افزایش سرعت اجرای وب اپلیکیشن های فلاتر

اگر یک برنامه نویس فلاتر هستید و با از نسخه وب اپلیکیشن پروژتون استفاده میکنید…

1 ماه ago

آموزش جامع انتشار اپلیکیشن اندروید و فلاتر در فروشگاه گوگل پلی Google play

به عنوان یک برنامه نویس فلاتر یا اندروید بعد از اتمام پروسه طراحی اپلیکیشن نیاز…

2 ماه ago

دانلود سورس کد رابط کاربری اپلیکیشن فلاتر پروژه پادکست

طراحی رابط کاربری اپلیکیشن پادکست خود را با استفاده از این کیت توسعه UI/UX فلاتر…

2 ماه ago

فایربیس چیست؟ معرفی سرویس ابری Firebase و کاربردهای آن

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

3 ماه ago

آموزش پیاده سازی Method Channel در فلاتر + فیلم

فلاتر یک فریم ورک برنامه نویسی چندسکویی است که این امکان را برای برنامه نویس…

3 ماه ago