PDA

View Full Version : آزاد سازی حافظه از اطلاعات تولید شده توسط برنامه



aghayex
سه شنبه 17 خرداد 1390, 22:53 عصر
با سلام خدمت دوستان توو برنامه ای که دارم و با اس کیو ال در ارتباط هم هست موقعی که اونو اجرا می کنم 40,536k از حافظه می گیره که این خودش با توجه به اینکه هنوز به اس کیو ال وصل نشده زیاد هم هست اما ازش صرف نظر میشه کرد
برای ارتباط به اس کیو ال هم از using استفاده می کنم که به نظرم تاثیری نداره .
برای گزارش گیری از برنامه stmul repor استفاده می کنم ، که موقعی که یک گزارش رو اجرا می کنمحجم حافظه اشغالی از 40,536k به 120,000k می رسه و بعد از اجرا نهایتا یه کم پایین میاد و 110,000k می رسه حالا اگه من دو گزارش دیگه رو اجرا کنم حجم حافظه اشغالی به 300,000k می رسه که این حجم باعث کند شدن برنامه می شه که خودشو حتی در باز کردن کمبوباکس هم نشون میده .
حالا از دوستان این درخواست رو دارم ببینن آیا من قاعده ای رو فراموش کردم یا نیاز به کدی هست

aghayex
پنج شنبه 19 خرداد 1390, 06:24 صبح
اگه دوستان در این مورد کار کردن راهنمایی کنن خیلی برام مهمه

Alghoochi
پنج شنبه 19 خرداد 1390, 13:44 عصر
اشیایی که با آنها کاری نداری رو با کد ObjectName.Dispose پاک کن تا حافظه‌ای که توسط اون شیئ اشغال شده آزاد بشه. مثلا فرض کن برای اتصال به بانک اطلاعاتی از یک DataAdapter استفاده کردی حالا وقتی کار دریافت اطلاعات تموم شد با کد DataAdapter1.dispose اونو پاک کن تا حافظه آزاد بشه. اگر بتونی یه بخش از کد که اطلاعات را دریافت و گزارش را تهیه می‌کنی اینجا قرار بدی بهتر می‌شه بهت کمک کرد.

محمد باقری نسب
پنج شنبه 19 خرداد 1390, 15:35 عصر
دوست عزیزمون جناب Alghoochi در اصل درست میگن. این روشی هست که شما باید به صورت استاندارد ازش استفاده کنی تا object هایی که کاری باهاشون نداری از حافظه خارج بشن!

ولی...

نکته اینجاست که سیستم مدیریت حافظه در دات نت مدیریت شده است (managed) واسه همین به برنامه نویس اجازه داده نمیشه که خودش در مورد مدیریت کردن حافظه تصمیم بگیره.

حالا عیب این کار چیه؟

این سیستم محترم مدیریت کننده حافظه کارشون رو به درستی انجام نمیدن. هر چند مایکروسافت کلاسی به نه نام GC رو تعبیه کرده (garbage collector) که شما بتونین به صورت دستی آشغالهای موجود در حافظه رو پاک کنید ولی متاسفانه این کلاس هم کارش رو به درستی انجام نمیده! چرا؟ نمیدونم!

بنده خودم بیش از 10 دفعه به microsoft connect فیدبک زدم که این مشکل رو بررسیش کنند ولی خوب اینجا ایران و ما ایرانی هستیم و در کل کشک!

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

انشاا... به زودی کل مطلب رو که به صورت مقاله دارم تهیه میکنم ، براتون میذارمش توی همین سایت!

aghayex
پنج شنبه 19 خرداد 1390, 18:09 عصر
ممنون از جوابهاتون
ولی
من از امکان dispose استفاده کردم ولی اون نتیجه دلخواهمو نگرفتم
یه مورد باقی ممیمونه ، برنامه هایی که توسط شرکت های معتبر ( بیشتر مایکروسافت ) ساخته می شه نگاه به تسک منیجر می کنیم خیلی خیلی کم حافظه رو مشغول میکنه
و آقا محمد اگه لطف کنی به صورت ناقص به اون روشت اشاره کنی ممنون می شم چون نیاز شدید هست

Hossis
پنج شنبه 19 خرداد 1390, 20:10 عصر
من نظرم اینه که در کل از حافظه کم استفاده کنیم یعنی او رو اشغال نکنیم
می تونیم یک متغیر رو که حجم زیادی از حافظه رو می گیره، در یک روال یا Sub تعریف کنیم تا وقتی کارش تموم شد، از حافظه بیرون بره
و همین طور بعد از اجرای یک عملیات، متغیرها رو خالی کنیم.
بعنوان مصال وغطی یک مطقیر رشطه ای چند مگابایت حافزه رو گرفته، اول اون رو خالی کنیم (muStr="") بعد اگه خواستیم dispose کنیم

Alghoochi
پنج شنبه 19 خرداد 1390, 22:41 عصر
ممنون از جوابهاتون
ولی
من از امکان dispose استفاده کردم ولی اون نتیجه دلخواهمو نگرفتم
یه مورد باقی ممیمونه ، برنامه هایی که توسط شرکت های معتبر ( بیشتر مایکروسافت ) ساخته می شه نگاه به تسک منیجر می کنیم خیلی خیلی کم حافظه رو مشغول میکنه
و آقا محمد اگه لطف کنی به صورت ناقص به اون روشت اشاره کنی ممنون می شم چون نیاز شدید هست

باید ببینی چه آبجکت‌هایی حافظه اشغال می‌کنند. من خودم همین مشکل رو مدت‌ها پیش داشتم. فکر می‌کردم حافظه توسط DataTable و چند کلاس دیگه مصرف می‌شه ولی بعد فهمیدم که حافظه توسط کلاسی که برای درخواست صفحات اینترنت نوشته بودم مصرف می‌شد. کدها رو خوب بررسی کن.
برنامه‌هایی که توسط مایکروسافت یا شرکت‌های بزرگ طراحی می‌شه بیشتر به زبان C++ هست و در C++ آزادی عمل خیلی بالاست +‌ اینکه اونها حافظه رو درست مدیریت می‌کنند.
شما کد‌هایی که نوشتی رو بررسی کن تا بفهمی حافظه توسط چه اشیائی اشغال شده

aghayex
شنبه 21 خرداد 1390, 06:57 صبح
من خیلی حساسم روی بحث حافظه اشغالی و بعد از تست کل برنامه بیشترین فضایی که یک شی در حافظه اشغال می کنه مربوط به شیی می شه که برای گزارشگیری استفاده می کنم ( گزارشگیر من stimul report هست ) بخصوص موقعی که از حالت نمایش اون استفاده می کنم
اون dispose هم می کنم اما نتیجه ای نداره

پیشنهاد = دوستان راهی سراغ ندارن که من کار گزارش گیری رو تحت یک پردازش جدا به سیستم بفرستم تا هر موقع تموم شد حافظشو ازش بگیره ( مثل ی برنامه که بسته میشه )
البته این کار رو با یه ترد انجام دادم اما باز پردازشش طبق برنامه خودم فرستاده شد و هیچ تاثیری نداشت

محمد باقری نسب
شنبه 21 خرداد 1390, 11:33 صبح
خدمت همه دوستان عزیزم عرض کنم که مقاله ای که قرار بود در رابطه با آزاد سازی حافظه در دات نت بنویسم رو آماده کردم و واستون گذاشتم.

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

http://barnamenevis.org/showthread.php?291082-%D8%B1%D8%A7%D9%87%DA%A9%D8%A7%D8%B1%DB%8C-%D8%AC%D8%A7%D9%84%D8%A8-%D8%AC%D9%87%D8%AA-%D8%A8%D8%B1%D8%B7%D8%B1%D9%81-%DA%A9%D8%B1%D8%AF%D9%86-%D9%85%D8%B4%DA%A9%D9%84-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D8%AD%D8%A7%D9%81%D8%B8%D9%87-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%D8%AA%D8%AD%D8%AA-Net-Framework.

فقط لطفا کامل و با دقت بخونیدش!