نشت حافظه را در ویندوز 11/10 پیدا و رفع کنید

Memory Leak یک جاگذاری نادرست منابع در یک برنامه کامپیوتری به دلیل تخصیص معیوب حافظه است. زمانی اتفاق می‌افتد که یک مکان RAM که استفاده نمی‌شود منتشر نشده باقی بماند. نشت حافظه را نباید با نشت فضایی اشتباه گرفت، که به برنامه ای اشاره دارد که از رم(RAM) بیش از حد لازم استفاده می کند. گفته می شود که نشت حافظه در سیستم Windows 11/10/8/7 زمانی رخ می دهد که حافظه علیرغم اینکه از آن استفاده نمی شود، در دسترس نیست.

نشت حافظه در ویندوز 11/10

قبل از شروع، باید بدانید که نشت حافظه یک مشکل نرم افزاری برای اشکال زدایی است – برای مثال در (Memory)جاوا(Java) ، جاوا اسکریپت(JavaScript) ، C/C++، ویندوز(Windows) و غیره. تعویض فیزیکی رم(RAM) یا هارد دیسک مورد نیاز نیست.

نشت حافظه در ویندوز 10

چرا بد است

بدیهی است که نشت حافظه بد است زیرا یک باگ یا نقص در سیستم است. اما بیایید دریابیم که دقیقاً چگونه روی سیستم تأثیر می گذارد:

  1. از آنجایی که حافظه حتی زمانی که استفاده نمی شود آزاد نمی شود، باعث کاهش حافظه می شود.
  2. فرسودگی حافظه منجر به پیری نرم افزار می شود.
  3. کاهش حافظه موجود منجر به افزایش زمان پاسخ و عملکرد ضعیف سیستم می شود.
  4. نشت حافظه بررسی نشده در نهایت می تواند منجر به از کار افتادن یک برنامه شود.

برای شناسایی نشت حافظه، یک برنامه نویس باید به کد منبع برنامه دسترسی داشته باشد.

تعیین محل نشتی

برای حل یک مشکل، ابتدا باید آن را شناسایی کنیم. مراحل اساسی برای تعیین محل نشتی حافظه عبارتند از:

  1. تأیید(Affirmation) : تعیین اینکه آیا نشت رخ داده است یا خیر.
  2. یافتن نشت حافظه در حالت هسته(Finding Kernel-mode memory leak) : تعیین محل نشتی ناشی از یک جزء راننده در حالت هسته.
  3. یافتن نشت حافظه در حالت کاربر(Finding User-mode memory leak) : شناسایی نشت ناشی از درایور یا برنامه در حالت کاربر.

تخصیص حافظه

حالت های مختلفی وجود دارد که در آن برنامه ها RAM را اختصاص می دهند. اگر پس از استفاده فضا آزاد نشود، بدون توجه به نحوه تخصیص، نشت حافظه رخ می دهد. برخی از الگوهای تخصیص رایج عبارتند از:

  1. عملکرد HealAlloc(HealAlloc) برای تخصیص حافظه پشته. معادل‌های زمان اجرا C/C++ malloc و جدید هستند.
  2. تابع VirtualAlloc(VirtualAlloc) برای تخصیص مستقیم از سیستم عامل.
  3. APIهای Kernel32(Kernel32 APIs) برای نگهداری حافظه هسته برای برنامه. به عنوان مثال(Example) ، CreateFile ، CreateThread .
  4. User32 API و Gdi32 API.

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

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

عادات نظارتی

نشت حافظه در ویندوز 10

شما باید مراقب استفاده غیرعادی از رم(RAM) توسط برنامه ها و برنامه های جداگانه باشید. می توانید با فشار دادن CTRL+SHIFT+ESCTask Manager ویندوز(Windows Task Manager) بروید و ستون هایی مانند Handles ، User Objects ، GDI Objects و غیره را اضافه کنید.

این به شما کمک می کند تا به راحتی استفاده از منابع را نظارت کنید.

بخوانید(Read) : انواع حافظه در کامپیوتر چیست؟(What are the Types of Memory in a computer?)

ابزارهای مایکروسافت(Microsoft) برای تشخیص نشت حافظه

ابزارهای مختلف نشت حافظه را برای حالت های مختلف تخصیص تشخیص می دهند:

  1. Application Verifier نشت پشته را تشخیص می دهد.
  2. UMDH (جزئی از ابزارهای اشکال زدایی ویندوز(Windows Debugging Tools) ) با نظارت بر تخصیص حافظه پشته، نشت را برای فرآیندهای فردی تشخیص می دهد.
  3. Trace Capture برای تجزیه و تحلیل کامل استفاده از RAM .
  4. Xperf نیز الگوهای تخصیص پشته را ردیابی می کند.
  5. CRT Debug Heap نه تنها تخصیص هیپ را ردیابی می کند، بلکه شیوه های کدگذاری را برای به حداقل رساندن نشت ها فعال می کند.
  6. ردیاب نشت حافظه جاوا اسکریپت نشت(JavaScript Memory Leak Detector) حافظه را در کدها رفع اشکال می کند.

نکات استفاده

  1. برای منابع Win32(Win32) و تخصیص هیپ از هسته های HANDLE و سایر اشاره گرهای هوشمند استفاده کنید.
  2. (Get)کلاس هایی برای مدیریت خودکار منابع برای تخصیص هسته از کتابخانه ATL دریافت کنید. استاندارد C++ دارای auto_ptr برای تخصیص پشته است.
  3. نشانگرهای رابط COM را با کمک (Encapsulate COM)_com_ptr_t یا _bstr_t یا _variant_t درون «اشاره‌گرهای هوشمند» کپسوله کنید .
  4. (Monitor)کد دات نت(.NET) را برای استفاده غیرعادی از حافظه کنترل کنید .
  5. از مسیرهای خروجی متعدد برای توابع اجتناب کنید(Avoid) تا تخصیص ها تا پایان یک تابع از متغیرها در اکثر بلوک ها آزاد شوند.
  6. (Use)فقط پس از آزاد کردن همه تخصیص ها در بلوک _finally از استثناهای بومی (_finally)استفاده کنید . به منظور استفاده از استثناهای C++، تمام تخصیص‌های heap و handle را در نشانگرهای هوشمند قرار دهید .(Wrap)
  7. همیشه تابع PropVariantClear را قبل از شروع مجدد یا دور انداختن یک شی PROPVARIANT فراخوانی(PROPVARIANT) کنید.

عیب یابی(Troubleshoot) نشت حافظه در ویندوز(Windows)

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

1] فرآیندها را ببندید و راه اندازی مجدد کنید.

اگر می بینید که یک فرآیند غیر ضروری رم(RAM) بیش از حد اشغال می کند، می توانید این فرآیند را در Task Manager پایان دهید . باید دستگاه را مجددا راه اندازی کنید تا فضای آزاد شده برای استفاده در سایر فرآیندها در دسترس باشد. بدون راه اندازی مجدد(Restart) مشکل نشت حافظه حل نمی شود. یکی از فرآیندهای خاص که دارای اشکالاتی برای کاهش سرعت کامپیوتر است Runtime Broker است. اگر غیرفعال کردن آن به تنهایی کار می کند، امتحان کنید.

2] ابزارهای تشخیص حافظه

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

برای دسترسی به ابزار تشخیصی حافظه(Memory Diagnostic Tool) داخلی برای ویندوز:

  1. تمام کارهای مهم خود را ذخیره کنید.
  2. Win + R را فشار دهید تا پنجره Run باز شود .
  3. دستور mdsched.exe را در پنجره Run تایپ کنید.
  4. کامپیوتر را مجددا راه اندازی کنید.
  5. پس از راه‌اندازی مجدد، یک اسکن اولیه انجام دهید یا به سراغ گزینه‌های « پیشرفته » مانند « (Advanced)آزمایش ترکیب(Test mix) » یا « تعداد پاس(Pass count) » بروید.
  6. برای شروع تست F10 را فشار دهید.

اینها هنوز اصلاحات موقتی هستند.

3] به‌روزرسانی‌های درایور را بررسی کنید

نرم افزار درایور را به روز کنید

درایورهای قدیمی باعث نشت حافظه می شوند. همه درایورها را به روز نگه دارید :

  1. Win + R را فشار دهید و پنجره Run را باز کنید. devmgmt.msc را(devmgmt.msc) تایپ کرده و Enter را فشار دهید . شما را به Device Manager می برد.
  2. (Check)درایورهای قدیمی را بررسی کنید و همه آنها را به روز کنید.
  3. برای به‌روزرسانی‌ها، ممکن است از دست داده باشید، Windows Update را بررسی کنید .

این ساده بود

4] عملکرد را بهینه کنید

برای بهترین عملکرد تنظیم کنید

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

  1. روی " This PC(This PC) " کلیک راست کرده و " Advanced " تنظیمات را در قسمت سمت چپ انتخاب کنید.
  2. در زیر برگه « پیشرفته(Advanced) »، به « عملکرد(Performance) » و سپس « تنظیمات(Settings) » بروید.
  3. " تنظیم برای بهترین عملکرد(Adjust for best performance) " ​​را علامت بزنید و روی OK کلیک کنید .
  4. راه اندازی مجدد(Restart) کنید و بررسی کنید که آیا مشکل حل شده است.

اگر این راه حل ساده جواب نداد، راه حل بعدی را امتحان کنید.

5] برنامه های(Programs) در حال اجرا در راه اندازی(Startup) را غیرفعال کنید

برنامه های راه اندازی

غیرفعال کردن برنامه های مشکل ساز تنها راه خلاص شدن از مشکل نشت حافظه است. به Task Manager بروید و برنامه مشکل ساز را غیرفعال کنید. اگر نمی دانید کدام برنامه ها مشکل ایجاد می کنند، این کار را انجام دهید:

  1. به " Task Manager " بروید.
  2. به " راه اندازی(Startup) " بروید.
  3. (Disable the startup programs)برنامه های راه اندازی را که نیازی به اجرای آنها ندارید به طور پیش فرض غیرفعال کنید.

6] هارد دیسک را یکپارچه سازی کنید

یکپارچه سازی دیسک

اگرچه ویندوز 10(Windows 10) این کار را به صورت خودکار برای شما انجام می دهد، ممکن است لازم باشد گاهی اوقات هارد دیسک ها را برای بهینه سازی عملکرد یکپارچه سازی کنید:

  1. به « این رایانه شخصی(This PC) » یا « رایانه من(My Computer) » بروید.
  2. (Right-Click)روی هارد دیسک سیستم (معمولاً درایو C :) کلیک راست کنید .
  3. به " ابزار(Tools) " در زیر " خواص(Properties) " بروید و " بهینه سازی(Optimize) " را انتخاب کنید .
  4. درایو مورد نظر را برای یکپارچه سازی انتخاب کنید و " Analyze " را انتخاب کنید.

پس از تقسیم بندی جدید، رایانه خود را مجدداً راه اندازی کنید.

7] ClearPage فایل در حالت خاموش شدن

اکنون پیچیده شده است - اما نگران نباشید. در اینجا نحوه پاک کردن فایل صفحه در هر خاموش شدن(clear the Page File at every shutdown) آورده شده است :

  • برای راه اندازی ویرایشگر رجیستری ، (Registry Editor)regedit را(regedit) در جستجو(Search) تایپ کنید.
  • این مسیر را وارد کنید:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory Management
  • مقدار ClearPageFileAtShutDown را به '1' تغییر دهید.( ClearPageFileAtShutDown to ‘1’.)
  • تغییرات را ذخیره کنید و دستگاه را Restart کنید.

این باید این کار را انجام دهد. به یاد داشته باشید که روند خاموش شدن شما کمی بیشتر طول می کشد.

9] Superfetch را غیرفعال کنید

این سرویس ویندوز(Windows Service) با به حداقل رساندن زمان بوت، عملکرد را بهینه می کند. این به ویندوز(Windows) اجازه می دهد تا مصرف رم(RAM) را مدیریت کند. زندگی(Life) پس از غیرفعال کردن Superfetch راحت نیست، اما در صورت لزوم این کار را انجام دهید. حداقل این را به تنهایی امتحان کنید تا مشکل را جدا کنید:

  1. Services.msc را(services.msc) جستجو کرده و به Services Manager بروید.
  2. به دنبال " Superfetch " بگردید و روی آن کلیک راست کنید تا به " Properties " بروید.
  3. " توقف(Stop) " را انتخاب کنید .
  4. همچنین سرویس را از منوی کشویی " غیرفعال " کنید.(Disable)
  5. کامپیوتر را مجددا راه اندازی کنید و بررسی کنید که آیا عملکرد بهبود یافته است یا خیر.

اگر این یکی کار نکرد، Superfetch را فعال کنید.

10] بدافزار را بررسی کنید

از یک نرم افزار آنتی ویروس شخص ثالث یا Windows Defender داخلی ویندوز 10 برای اسکن و حذف بدافزار استفاده کنید. مطمئن(Make) شوید که آنتی ویروس برای پشتیبانی از سیستم عامل شما به روز شده است تا در نهایت دلیل نشت حافظه نباشد.

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



About the author

من یک برنامه نویس کامپیوتر هستم و بیش از 15 سال است که هستم. مهارت های من در توسعه و نگهداری برنامه های کاربردی نرم افزاری و همچنین ارائه پشتیبانی فنی برای آن برنامه ها نهفته است. همچنین برنامه نویسی کامپیوتر را به دانش آموزان دبیرستانی آموزش داده ام و در حال حاضر یک مربی حرفه ای هستم.



Related posts