PDA

View Full Version : حرفه ای: ازاد کردن فضای حافظه هنگام بستن فرم



ahmadi.edu
یک شنبه 17 مرداد 1389, 10:40 صبح
سلام، خسته نباشید. من یه سوال دارم، اگه امکانش هست کمکم کنید.من وقتی یه فرم از برنامه را میبندم حافظه ای که اون فرم اشغال کرده آزاد نمیشه. من از GC استفاده کردم ولی فایده ای نداره.(من از مشاهده میزان فضای اشغال شده توسط برنامه در task manager متوجه شدم که حافظه ای که در اثر باز کردن فرم ایجاد میشه در اثر بستن اون از بین نمیره).

saeedalg
یک شنبه 17 مرداد 1389, 12:43 عصر
خب شاید موقع باز کردن فرم یه شی دیگه هم ایجاد میکنی و اون رو پایین نمیاری، بهتره سعی کنی برای تمام اشیات از IDisposable به ارث ببری و Dispose رو فراخونی کنی و اشیای زیادی رو null کنی و تهش از GC استفاده کنی، اما تمام اینا اما و اگرن کدت رو بزاری بهتر میشه کمک کرد.

ahmadi.edu
یک شنبه 17 مرداد 1389, 13:23 عصر
یه واقعیت (حداقل من توی C# این رو فهمیدم) اینه که اگه شما هر فرمی رو باز کنی و بعد بخوای ببندی فضای اشغال شده توسط اون فرم ازاد نمیشه. (میتونی توی task manager ببینی) فرقی نمیکنه که فرمت ساده باشه یا اینکه مملو ابجکت ها و thread ها و ... باشه.
اما این IDisposable رو که گفتی من استفاده نکردم ولی اگه مثل همون dispose فرم باشه یعنی همون کار رو انجام بده فکر نمیکنم فایده ای داشته باشه. حلا اگه ممکنه بیشتر دربارش توضیح بده تا ببینیم فایده داره یا نه.راستی از همه معذرت میخوام اگه خودمونی حرف میزنما، من چاکر همتون هم هستم و از کسانی که جواب پست هام رو میدن بسیار ممنونم.

saeedalg
یک شنبه 17 مرداد 1389, 15:41 عصر
IDisposable چیز خاصی نیست میتونی در نظر بگیری یه جور distructor رو داری فراخونی میکنی مثلا به Contructor و Ditructore تایمر سیستمت دسترسی نداری یه چنین امکاناتی میده از پروژت جداش کنی. ولی کدت رو بذار بعد. الان نمیدونم چی کار داری میکنی.

ahmadi.edu
یک شنبه 17 مرداد 1389, 17:43 عصر
اخه من کجای کدمو برات بذارم؟یعنی این مشکل من مربوط به جای خاصی نمیشه شما فکر کن فرم من کلی ابجکت داره، چندتا thread داره و یه سری هم timer و چیزهای معمولی دیگه.نگاه کن دوست عزیز من وقتی دکمه ضربدر فر ممو میزنم ، فرم بسته میشه و متد dispose خود فرم فراخونی میشه. من توی رویداد form_closing از gc.collect استفاده کردم که جواب نداد، تمام کنترل ها رو هم یکی یکی تخریب کردم باز جواب نداد. حالا اینکه شما میگی کدتو بدار ، کدی نیست که بخوام بذارم.اصلا مسئله ی من اینه: میخوام یه فرم ببندم و فضای اشغال شده فرم ازاد بشه شما یه راه حل یا یه تیکه کد به من بدید. راستی گفتم که توی C# بعد از بستن فرم ها معمولا فضای اشغال شده توسط اونها ازاد نمیشه.یعنی ریطی نداره که من توی فرمم از چه ابجکت ها و اشیایی استفاده کرده باشم یا چه جوری برنامه نوشته باشم.ازاد شدن حافظه بعد از بستن فرم یه کار غیر معموله.

cardano7
یک شنبه 17 مرداد 1389, 18:07 عصر
سلام داداش های گل من
اول بگم که GC میاد حافظه رو زباله روبی می کنه و آشغال ها رو میگذاره دم در. اما اینکه این آشغال های آماده رو کی میگذاره سر خیابون، بحث دیگری ست. در حقیقت باید گفت هر وقت عشقس بکشه به اونا ترتیب اثر میده. اگه اشتباه نکنم زمانی که سیستم حافظه کم بیاره یا برنامه بسته بشه معمولا این کار رو بکنه. دقیق نمی دونم. اما اگه شما سیستمت دچار مشکل نمیشه فکرش رو نکن.
در مورد IDispose هم بگم که بهتره توسط دستور using استفاده بشه و مستقیم صدا زده نشه:
http://barnamenevis.org/forum/showthread.php?p=1019938#post1019938

ahmadi.edu
دوشنبه 18 مرداد 1389, 09:54 صبح
مشکل من زمانی به چشم میاد که شما یه برنامه بزرگ داشته باشی که فرمهای زیادی ( مثلا 15 فرم با هم باز باشن(برنامه چت)) اینجاست که میزان اشغال حافظه میره بالا، در سیستمهای امروزی که حافظه های زیادی دارن مشکلی پیش نمیاد، ولی این جور برنامه دیگه یه برنامه حرفه ای نیست، یعنی ما عملا داریم صورت مسئله رو پاک میکنیم.
من میخوام برنامم در هر صورت بهینه باشه.
در مورد GC میدونم که هیچ غلطی نمیکنه، Dispose هم که اصلا نمیدونم واقعا کاری میکنه یا نه،هرچی هست فضا رو که ازاد نمیکنه.
حالا من یه روشی رو امتحان کردم که جواب داده ولی نمیدونم درسته یا نه.
مثلا اگه بر نامه من 50mb حافظرو اشغال کرده باشه، من یه دستوری به برنامه میدم که کمترین وبیشترین میزان فضای مورد نیاز رو میگیره و اعمال میکنه، در اینصورت فضای اشغال شده مثلا میرسه به 20mb. ولی نمید.نم ایا اون 30mbی که ازاد شده بعدا برنامرو با مشکل مواجه میکنه یا نه یا اصلا اون حافظه استفاده خواهد شد یا نه؟البته هر عددی رو بعنوان حداکثر قبول نمیکنه.یعنی اگه برنامه در حال استفاده از اون حافظه باشه پیغام خطا میده.
حالا میخواستم نظرتون رو بگید.به نظرتون خوبه یا نه؟البته با چند تا تست که انجام دادم برنامه مشکل پیدا نکرد.ولی اینکه اون تو چی میگذره منو میترسونه.میترسم یه وقت برنامه منفجر بشه.

cardano7
چهارشنبه 20 مرداد 1389, 09:28 صبح
مشکل من زمانی به چشم میاد که شما یه برنامه بزرگ داشته باشی که فرمهای زیادی ( مثلا 15 فرم با هم باز باشن(برنامه چت)) اینجاست که میزان اشغال حافظه میره بالا، در سیستمهای امروزی که حافظه های زیادی دارن مشکلی پیش نمیاد، ولی این جور برنامه دیگه یه برنامه حرفه ای نیست، یعنی ما عملا داریم صورت مسئله رو پاک میکنیم.
من میخوام برنامم در هر صورت بهینه باشه.
در مورد GC میدونم که هیچ غلطی نمیکنه، Dispose هم که اصلا نمیدونم واقعا کاری میکنه یا نه،هرچی هست فضا رو که ازاد نمیکنه.
حالا من یه روشی رو امتحان کردم که جواب داده ولی نمیدونم درسته یا نه.
مثلا اگه بر نامه من 50mb حافظرو اشغال کرده باشه، من یه دستوری به برنامه میدم که کمترین وبیشترین میزان فضای مورد نیاز رو میگیره و اعمال میکنه، در اینصورت فضای اشغال شده مثلا میرسه به 20mb. ولی نمید.نم ایا اون 30mbی که ازاد شده بعدا برنامرو با مشکل مواجه میکنه یا نه یا اصلا اون حافظه استفاده خواهد شد یا نه؟البته هر عددی رو بعنوان حداکثر قبول نمیکنه.یعنی اگه برنامه در حال استفاده از اون حافظه باشه پیغام خطا میده.
حالا میخواستم نظرتون رو بگید.به نظرتون خوبه یا نه؟البته با چند تا تست که انجام دادم برنامه مشکل پیدا نکرد.ولی اینکه اون تو چی میگذره منو میترسونه.میترسم یه وقت برنامه منفجر بشه.

برادر من،
چه کار به کار سیستم عامل و مفسر داری؟ اونا خودشون با هم کنار میاند. نگران اونا نباش. اگه optimize بودن خیلی برات مهم هست، هیچ وقت سراغ دات نت نرو. چون اعصابت رو خورد می کنه. خود #C داره بهت میگه که لازم نیست object ی رو از حافظه حذف کنی. اون رو بده دست من خودم هر وقت صلاح دیدم یک بلایی سرش میارم. شما کاریت نباشه. دیگه پلتفرم از این مهربون تر؟