PDA

نسخه کامل مشاهده نسخه کامل : مشکل با out of memory exception



ahmad_ferd
23-07-2012, 10:22
با سلام به دوستان
یه مشکل عجیب تو پروژه ای که نوشتم پیدا کردم , بعد از باز شدن چند تا فرم پیغام out of memory exception مواجه میشم در حالی که کلی حافظه و سی پی یو دارم , این مشکل روی یکی از کامپیوتر مشتری ها به وجود اومده اما به نظرم روی هر کامپیوتری ممکنه بوجود بیاد , کسی میدونه مشکل از کجاست ؟ اگه دقیق راهنمایی کنین ممنون میشم

_H2_
23-07-2012, 22:14
سلام
چند وقت قبل دوستی مشکلی مشابه داشت که موارد زیر را به ایشان پیشنهاد کردم:



در مورد خطا مد نظرتان مطلب دقیقی نمیتوانم بیان کنم، فقط میتوانم یک سری پیشنهاد کلی برایتان مطرح کنم:

- شما میتوانید با TaskManager و PerformanceMonitor برنامه ها را زیر نظر بگیرید و ببینید دقیقاً چه exe ای مصرف نا متعارفی دارد و مدام حافظه بیشتری مصرف میکند.

- این خطا میتوانید بعلت بی دقتی در کدنویسی خود برنامه هم باشد (نشت حافظه)، شما باید تلاش کنید که تا حدامکان اشیایی را که قابلیت IDisposable در اولین فرصت ممکن نابود کنید.
(مثلاً اگر مدام یک DataSet یا Bitmap و... تولید و جای قبلی می ریزید، سعی کنید مقدار قبلی را Dispose کنید)

- در تعریف اشیا فوق مثل (Connection و DataSet و Bitmap و...) تا حد امکان از دستورات Using یا Dispose در انتهای مصرف استفاده کنید.

- قبل از انجام اعمال سنگین بارگذاری در RAM (مثل پرکردن یک DataSet بزرگ) از دستور GC.Collect استفاده کنید.

- برنامه را طوری اصلاح کنید که نیاز نباشد کل یک جدول را در خروجی آن نمایش دهید.
مثلاً SELECT * FROM tablename دستور جالبی برای اجرا در یک برنامه صنعتی نیست!
(بعنوان نمونه ما در برنامه خودمان کامل سیستم صفحه بندی را داریم و هیچ زمان یک گراید کل یک جدول را بارگذاری و نمایش نمیدهد)

- در چاپ های سنگین هم میتوانید تنظیمات را یکبار از کاربر دریافت کنید (مثل چاپگر و کاغذ و...) و سپس خودتان با کدنویسی اطلاعات را در قالب 100 صفحه ، 100 صفحه درخواست داده و به برنامه گذارش ساز بدهید و دستور چاپ بدهید و سپس 100 صفحه بعدی و...
(طبیعتاً کار خوب زحمت دارد و کدنویسی بیشتر و دقیق تری میخواهد !)

- کلاً به هر طریقی که ارتباط سنگین با دیتابیس دارید، داشتن تفکر صفحه بندی و جریان گرایی (Stream) بهتر است ولی متاسفانه اغلب ابزار آماده به علت سادگی استفاده روی بارگذاری کل اطلاعات در RAM تاکید دارند و مانور میدهند و این در حالی است که RAM ها همواره کمتر از ظرفیت تجهیزات Harddisk ذخیره سازی دیتابیس ها هستند.

- در طراحی اولیه جداول و انتخاب PrimaryKey ها دقت کنید و در انتخاب یا عدم انتخاب ستون هایی برای کاندید Index شدن دقت کنید.

- برخی موارد این خطاها میتواند از مشکلات داخلی خود ابزار تولیدی مایکروسافت هم باشد.
گرچه به تجربه من بیشتر موارد مقصر خود نحوه کدنویسی است.
دقت کنید برنامه خارج محیط VS هم خطا میدهد یا نه.
و در نهایت مایکروسافت مدام پک های بروزرسانی برای Win,SqlServer,VS,Framework و... ارائه میدهد...
تلاش کنید سیستم تان را بروز نگاه دارید.

- هرچقدر هم RAM و منابع آزاد زیاد داشته باشید، بازهم مصرف زیاد این منابع را بی اثر می کند.
در اغلب رایانه های دوستان که دقت میکنم، تعداد بسیار زیادی برنامه کاملاً بی فایده در Startup دارند.
برنامه کمکی msconfig را اجرا ترجیحاً کلیه موارد فهرست Startup غیر فعال کنید، مطمئن باشید با غیر فعال کردن همه انها هم باز رایانه تان به خوبی کار میکنید.
نترسید! باور کنید! یکبار تیک همه را بردارید و رایانه را ریست کنید اگر چیزی درست کار نکرد، میتوانید مجدد تیکش را بگذارید.
(تازه این لیست فقط بخش کوچکی از اجرای بیمصرفی است که همراه سیستم عامل تان شروع میشود!)

- ضرری ندارد سیستم تان را با یک ضدویروس بروز رسانی شده هم اسکن کنید...!

و...

در نهایت هم شما باید مکانیزم دقیقی برای ثبت کامل اطلاعات خطاهای احتمالی در یک فایل متنی و یا جدولی در دیتابیس داشته باشید تا بتوانید در این شرایط با مراجعه به آن logfile یا جدول دیتابیس متوجه خصایص و محل خط و دستوری که خطا در آن رخ داده و.... بشوید، فقط داشتن یک متن "out of memory exception" بدون اطلاعات اضافه مثل محل کد و... خیلی کمکی نمیکند...

موفق باشید.

ahmad_ferd
24-07-2012, 14:08
ممنون دوست عزیز , این مشکل روی کامپیوتر خودم بوجود نیومده و روی کامپیوتر دیگه ای هستش , واسه همین نمیدونم خطا کجا رخ میده و کدوم کد مشکل داره چون فایل کامپایل شده اینن مشکل بوجود اومده , ممکنه بگین متد dispose کجا و برای چه اشیایی باید به کار بره ؟ ممنون

_H2_
24-07-2012, 20:15
سلام

ممکنه بگین متد dispose کجا و برای چه اشیایی باید به کار بره ؟
توضیحاتی در پست پنجم تاپیک زیر داده ام ...
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]



نمیدونم خطا کجا رخ میده
!
حداقل حداقل حداقل یک try-catch در main اضافه کنید تا با نمایش اطلاعاتش از محل کد اطلاع دقیق تری بدست آورید.

shotok
26-07-2012, 12:39
به نام خدا
با سلام
بنده هم همین مشکل رو دارم؛و توصیه های جناب _H2 هم متاسفانه نتونست حل کنه.
جالب اینجاست که جدیدا وقتی می خوام فرمی رو باز کنم هم همین خطا رو میده؛ قبل از اینکه تو اجرا بگیرم.
رم سیستمم هم 4.
با سپاس

shotok
29-07-2012, 17:51
با سلام
قبلا مطلبی جناب H2 فرموده بودن و فراموش کرده بودم انجام بدم و اون اینکه ویندوزم رو 64 بیتی کنم ولی بنده فراموش کرده بودم.
در حال حاضر ارور مذکور رو نمیده ولی وقتی میخوام پروژه رو با از .Net reactor یا نرم افزارهای دیگه ای محافظتی؛ محافظت کنم. همین خطا رو میده.
با سپاس

shotok
15-08-2012, 13:12
قبل از انجام اعمال سنگین بارگذاری در RAM (مثل پرکردن یک DataSet بزرگ) از دستور GC.Collect استفاده کنید.

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