نمایش نتایج 1 تا 6 از 6

نام تاپیک: پاک کردن حافظه های بلااستفاده ؟

  1. #1

    Question پاک کردن حافظه های بلااستفاده ؟

    سلام
    من در برنامه ام چند thread دارم که با توابع مختلفی Api و غیره کار کرده اند و لازم است که pointer هایی تعریف ،new و مقدار دهی شوند که در کد thread از آنها استفاده می شود.
    چند thread این برنامه در یک حلقه بی نهایت مدام درحال اجرا هستند.
    با اجرای برنامه، مقدار memory در task manager دائم بالا می رود و بیشتر می شود. و همین باعث می شود که بعد از مدتی از اجرای برنامه ، سیستم بسیار کند شود.
    تمام دقت و سعیم را کرده ام که هرجا حافظه ای ایجاد و مقدار دهی می کنم، بعد از استفاده آنرا delete کنم. اما باز هم مشکل برنامه حل نشده.
    با استفاده از تابع SetProcessWorkingSetSize برخورد کردم. می خواستم از دوستانی که اطلاعات بیشتر در کاربرد این تابع دارند، به من کمک کنند.
    چطور مشکلم را حل کنم؟
    متشکرم

  2. #2

    نقل قول: پاک کردن حافظه های بلااستفاده ؟

    اون تابع مشکل مصرف حافظه شما را حل نمیکنه.

    شما اگر مصرف حافظه تان به طور متناوب افزایش پیدا میکنه، باید با یک profiler بررسی کنید که چه بخشی از کد شما این حجم حافظه را تولید میکنه، و چرا؟ به نظر میرسه که جایی Memory Leak دارید.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  3. #3

    نقل قول: پاک کردن حافظه های بلااستفاده ؟

    متشكر از جوابتون.
    كد داخل thread ها خيلي زياد هستند. نمي تونم اينجا قرار بدم.

    حدس ميزدم كه تابع SetProcessWorkingSetSize تاثيري در آزاد كردن حافظه هاي اضافي نداره. اما با قرار دادن اين تابع در آخر thread ها باعث شده مقدار حافظه اي كه در task manager مي بينم، كمتر بشه. افزايش داره ولي با سرعت كمتري زياد ميشه. اما همچنان بعد از مدتي از اجراي exe سيستم كند و كندتر ميشه.
    ولي نتونستم متوجه بشم كه دقيقا اين تابع چه كار مي كنه.
    كي مي تونه در مورد كار اين تابع (SetProcessWorkingSetSize) برام توضيح بده؟ متشكر ميشم.

  4. #4

    نقل قول: پاک کردن حافظه های بلااستفاده ؟

    بزرگترین دلایل memory leak در برنامه ها این هست که با new به اشاره گری حافظه تخصیص داده می شود و سپس بدون اینکه delete شود، کاری کنیم که اشاره گر به مکان دیگر اشاره کند. این طوری دسترسی به حافظه را از دست می دهیم و اگر این عمل در حلقه باشد، همین طور افزایش حافظه خواهیم داشت و عدم دسترسی به آن.

    در هر صورت دقت کنید اگر از سایر توابع استفاده می کنید، دربسیاری موارد آن ها نیز تابع delete / release دارند که باید اجرا شوند.


    SetProcessWorkingSetSize هم در مورد شما کاربرد ندارد، چون برنامه شما به اشتباه حافظه می گیرد، اگر میزان Maximum حافظه مورد نیاز پروسه را کم کنید، چون از طریق افرایش اشتباهی حافظه به آنجا می رسید سپس برنامه شما دیگر نمی تواند حافظه فیزیکی سیستم را استفاده کند. مثلا می توانیم minimum را نیز 30MB قرار دهید، این طوری در هنگام اجرای برنامه پروسه شما 30 MB رزرو می کند و یکجا از سیستم می گیرد، هر چند که این تابع تضمینی نیست و حافظه را قفل نمی کند، سیستم در مواقع بحرانی، حافظه بلا استفاده را از پروسه می تواند بگیرید.

    در کل شما باید به دنبال رفع خطا / bug باشید.
    آخرین ویرایش به وسیله Nima_NF : پنج شنبه 20 خرداد 1389 در 13:06 عصر

  5. #5

    نقل قول: پاک کردن حافظه های بلااستفاده ؟

    ضمنا debugger خود ++visual C امکاناتی دارد که برای یافتن memory leak حتما از ان ها استفاده کنید.

    در شروع برنامه در قسمت main ، یا در قسمت شروع یک thread کد زیر را بنویسید:

    #if defined(DEBUG) | defined(_DEBUG)
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
    #endif
    تابع CrtSetDbgFlag را در MSDN چک کنید تا سایر فلگ ها را مشاهده کنید.

    _CRTDBG_LEAK_CHECK_DF برای چک کردن memory leak هست، یعنی هرگاه برنامه را ببندید (در حالت اجرا debug) کامپایلر به شما می گوید که کدام بخش از حافظه را تخصیص داده اید ولی خودتان آزاد نکرده اید.

    دقت کنید در پنجره Output بعد از خروج از برنامه عبارت Detected memory leaks! نوشته می شود و سپس Dumping objects نشان داده می شود. مثلا اگر یک اشاره گر باشد که Int را اختصاص می دهد، به شکل زیر نوشته می شود:

    Detected memory leaks!
    Dumping objects ->
    {1036} normal block at 0x00EC32A8, 4 bytes long.
    Data: < > 00 00 10 00
    {1035} normal block at 0x00EC3268, 4 bytes long.
    Data: < > 00 00 10 00
    {1034} normal block at 0x00EC3228, 4 bytes long.
    .......

  6. #6

    نقل قول: پاک کردن حافظه های بلااستفاده ؟

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

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •