PDA

View Full Version : خطا out of memory



setareh masompoor
شنبه 05 اسفند 1391, 09:19 صبح
سلام بچه ها يه سوال داشتم ميدونم شايد اين تاژيك تكراري باشه اما هيچ جا ازش جوابي نيومده
من يه برنامه براي يه سيستم فروشگاهي نوشتم كه در حالت عادي مشكل نداره اما وقتي موقع حراج فروشگاست و برنامه با 4 يا 5 كاربر همزمان كار ميكنه اين خطا رو ميده.
سروري كه روش اين برنامه نصب هست سيستم خوبيه
5G RAM داره و cpu خوبي هم داره
اما باز اين مشكل رو دارم
ميشه راهنماييم كنيد؟؟؟؟؟؟؟؟؟؟؟
100445

veniz2008
شنبه 05 اسفند 1391, 09:26 صبح
سلام. مشکل سمت سرور نیست. مشخصات سیستم های کلاینت به چه صورت هستن؟. از چه روشی برای کدنویسی استفاده کردید؟. معمولا این خطا در هنگام استفاده از کدوم بخش برنامتون رخ میده؟(اگر امکانش هست کدهای اون بخش رو بذارید یا توضیحاتی درباره نحوه کدنویسیش بدید).

setareh masompoor
شنبه 05 اسفند 1391, 09:35 صبح
وقتي كه ميخوان فاكتور فروش بزن اين اتفاق ميافته
مشخصات سيستم هاي كلاينت هم خوبه
فقط وقتي بار بر روي برنامه زياد ميشه اين اتفاق ميافته يعني وقتي پشت هم فاكتور ميزنن
و گرنه در حالت عادي خطايي پيش نمياد
كد نويسي به صورت 3 لايه بوده
از تبديل داده ها هم زياد استفاده نشده مگه در شرايط ضروري

veniz2008
شنبه 05 اسفند 1391, 09:39 صبح
واسه صدور فاکتور شما قاعدتا اول داده ها رو از جدول میخونید و درون یک دیتاتیبل (یا دیتاست) میریزید و بعد اونو به گزارش گیر خودتون میدید، آیا بعد از صدور فاکتور، حافظه رو آزاد میکنید؟

setareh masompoor
شنبه 05 اسفند 1391, 09:41 صبح
واسه صدور فاکتور شما قاعدتا اول داده ها رو از جدول میخونید و درون یک دیتاتیبل (یا دیتاست) میریزید و بعد اونو به گزارش گیر خودتون میدید، آیا بعد از صدور فاکتور، حافظه رو آزاد میکنید؟


آره بعد از صدور فاكتور ديتا ست آزاد ميشه

veniz2008
شنبه 05 اسفند 1391, 09:46 صبح
با چه کدی آزاد میکنید؟. کدش رو بزارید.

setareh masompoor
شنبه 05 اسفند 1391, 09:57 صبح
ببينيد بذار دقيقا بگم در چه صورت اين اتفاق ميافته
وقتي كه يه فاكتور باز هست و كاربر ميره يه فاكتور ديگه هم باز ميكنه يا يه فاكتوري رو برگشت ميزنه
يعني اگه همزمان 2 فاكتور باز باشه اين اتفاق ميافته
يكي از نيازاي سيستم هم همينه كه 2 يا چند فاكتور همزمان باز باشن

veniz2008
شنبه 05 اسفند 1391, 10:18 صبح
ببينيد بذار دقيقا بگم در چه صورت اين اتفاق ميافته
وقتي كه يه فاكتور باز هست و كاربر ميره يه فاكتور ديگه هم باز ميكنه يا يه فاكتوري رو برگشت ميزنه
يعني اگه همزمان 2 فاكتور باز باشه اين اتفاق ميافته
يكي از نيازاي سيستم هم همينه كه 2 يا چند فاكتور همزمان باز باشن
مورد اولی که باید مد نظر داشته باشید اینه که تا حد امکان از دیتاتیبل به جای دیتاست استفاده کنید (هر دوی این اشیا از رم سیستم شما استفاده میکنن ولی دیتاست چون یه نما (view) از دیتابیس هست شی سنگین تری محسوب میشه و رم بیشتری هم مصرف میکنه).
مشکل شما ظاهرا از این چیزها نیست. اگر امکانش هست کدتون رو بذارید چون با این توضیحات نمیشه کمکی کرد. چیزی که مشخصه اینه که این وسط یه چیزی داره رم رو میخوره و من احتمال زیاد میدم که شما حافظه رو آزاد نمیکنید.

setareh masompoor
شنبه 05 اسفند 1391, 13:40 عصر
مشكل منم همينه كه اصلا از ديتا ست استفاده نكردم و كلا از ديتا تيبل استفاده كردم بعد هم حافظه رو آزاد كردم با دستور .dispose()

veniz2008
شنبه 05 اسفند 1391, 19:36 عصر
متاسفانه خیلی از دوستان فکر میکنن که با یک dispose حافظه پس گرفته میشه در صورتیکه این عمل بصورت خودکار انجام نمیشه و بایستی با کد زیر این کار رو انجام بدید:
ابتدا دیتاتیبل رو clear کنید و بعد از اون از کلاس GC و از متد Collect اون برای آزاد کردن حافظه بدون مصرف استفاده کنید :

dt.clear();
GC.Collect();
برای اینکه در عمل تاثیر کد بالا رو ببینید به لینک زیر مراجعه کنید. در لینک زیر قبلا آقای Hajivandian یک فایل تست گذاشتن که میتونید بخوبی مراحل کار رو درک کنید. در همون تاپیک هم بصورت کامل توضیح دادم.
موفق باشید.
http://barnamenevis.org/showthread.php?370492-%D8%AE%D8%A7%D9%84%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-Data-grid-view-%D8%9F&highlight=%D8%AD%D8%A7%D9%81%D8%B8%D9%87

setareh masompoor
یک شنبه 06 اسفند 1391, 13:02 عصر
از راهنماييت ممنونم اما يه نكته كه بهش برخوردم اينه كه مثلا اگه سيستم 8G‌ حافظه داشته باشه وقتي اين خطا پيش مياد performance سيستم رو نگاه ميكنم فقط 3G استفاده شده و بقيه آزاد هست
اين يعني چي خب؟؟؟؟؟؟؟؟؟؟؟؟
من كه نميفهمم
يعني cash پر ميشه كه اين خطا رو ميده؟؟/

veniz2008
یک شنبه 06 اسفند 1391, 13:28 عصر
ببینید cache مربوط به cpu هست و حافظه ای هست که داده رو برای پردازش نگهداری میکنه و ارتباطی به رم نداره. در قسمت خصوصیات فرم، یک گزینه با عنوان DoubleBuffered وجود داره که بصورت پیش فرض false هست. معمولا برای فرم های سنگین و پر پردازش این گزینه رو true میکنن. این کار رو انجام بدید شاید مشکلتون حل شد. در غیر اینصورت باید کدتون رو بذارید تا بررسی بشه.