PDA

View Full Version : آزاد نکردن حافظه در Intraweb



delphi developer
چهارشنبه 22 فروردین 1386, 17:18 عصر
با سلام
بنده از Intraweb8 که همراه delphi 2006 منتشر شده استفاده میکنم و برنامه ای نوشتم که هم اکنون در چند شرکت راه اندازی شده. مشکل بنده مصرف حافظه ی بیش از اندازه ی ست که حتی در زمانی که Terminate ، Sessionمیشه باز از حافظه ای که برنامه گرفته کم نمی شود.(شما خودتون می توانید این مورد را با ایجاد یک برنامه ساده توسط Intraweb از نوع StandAloan امتحان کنید و ببنید با ایجاد کردن Session های جدید و Terminate کردنشون، Task Manager هیچ گونه کم شدن حافظه ای را نشان نمی دهد) این مشکل تا حدی بزرگ شده که برنامه 2 مگی من در یک شرکت حدود 2G حافظه گرفته بود....

از دوستان گرامی مخصوصا Alireza Kousha عزیز که ظاهراً یه برنامه ی کامل با Intraweb نوشتن تقاضا دارم بنده را راهنمایی نمایند.

ghabil
چهارشنبه 22 فروردین 1386, 21:12 عصر
به ازای هر Session در اینتراوب 2k حافظه در رم سرور گرفته میشه ، حالا میتونی یونیت UserSession رو کاملتر هم بکنی مثلا بشه 3K ، از این ببعد میشه اینکه چه چیزایی Create میکنی و با چه Owner هایی... تو اون مقاله آموزشی اینتراوب گفته بودم که فرمهات رو با Owner شی WebApplication بسازی ؛ که با ترمینیت شدن سشن فرمت هم ترمینیت بشه.
داستان دیگه که خیلی مهمه (نه در اینتراوب در برنامه نویسی WebBased) اینه که کوءریهات تا حد ممکنه اطلاعات کمی رو برگردوند و سریغ هم دیاستهاشون خالی بشه ، چون همه دیتایی که از سرور لود میکنی توی حافظه سرور نگهداری میشه و به ازای هر کاربری که وصل میشه این اتفاق دوباره میفته !
نکته خیلی مهم که یادم نیست تو اون مقاله نوشتم یا نه ابنه که بسیار توصیه شده هست که کلا تمام کمپونتهای دیتابیسی رو روی UserSession بزاری نه روی فرمها و دلیلش هم همین اطمینان از آزاد شدن حافظه ای که میگیرند.
نهایتا این مشکلی که نوشتی که به 2 Gig هم میرسه حافظه گرفته شده تقریبا با اطمینان میتونم بگم فقط در حالتی که دیتای خیلی زیادی از دیتابیس خونده باشی توی برنامهت اتفاق میفته ، اینکه میگی فضا آزاد نمیشه ، اصولا تا جایی که منم میدونم کاربرها وقتی کارشون تموم شد حوصله زدن دکمه خروج یا Log Out رو نداند و صفحه رو میبندند که این موجب میشه کد Terminate اجرا نشه و تا وقتی که Session به Time Out خودش که مقدار Defaultش 10 دقیقه هست نرسه Terminate نمیشه. که میدونی که میتونی این مقدار رو Costumize کنی خودت. به هر حال اینکه فکر کنی این باگ Intraweb هست خیلی بعیده (میگم بعید چون ممکنه تو یک ورژن خاص باشه و الا حتما اینطوری نیست اینهمه برنامه با IW نوشته شده و مشکلی ندارند) بهتره بگردی ببینی کجا آبجکتهایی میسازی (بخصوص دیتابیسی) که بعدا به امید خدا رو هوا ولشون میکنی...
راستی تو اون مقاله نوشته بودم برای آزد کرد فرمها نباید از Free استفاده کنی باید از Release استفاده کنی اونم دیدی؟

delphi developer
پنج شنبه 23 فروردین 1386, 09:43 صبح
با تشکر از توجوهتون.
مورادی که فرمودید رعایت شده است. برای ایجاد تمام فرم ها از WebApplication، Owner استفاده شده، بنده از کامپونت های دیتابیسی به صورت مستقیم استفاده نمی کنم ولی برای دسترسی به پایگاه داده تمام کلاس های لازم را با WebApplication، Owner ایجاد می کنم و در OnDestroy تمام آنها را Release می کنم....
ولی مسئله اینجاست، همانطور که گفتم اگر جنابعالی یک برنامه ساده با Intraweb و از نوع StantdAloan بسازید و خودتان دستی Session ها را ایجاد و Terminate کنید در Task Manager ویندوز هیچ بازپسگیری حافظه ای را از برنامه خود نمی بینید. حالا اگر برنامه را از نوع ISAPI ایجاد کرده باشید باید این عدم پسگیری و زیاد شدن حجم برنامه را مثلا برای INETINFO.exe مشاهده نمایید.

spicirmkh
سه شنبه 13 شهریور 1386, 17:23 عصر
سلام

من فرم ها را بصورت WebApplication، Owner ایجاد می کنم و برای بستن فر از دستور Release استفاده می کنم ، حال 2 سوال پیش می اید

1- چرا به دکمه عقب گردد internet Explorer نمی شود عقب رفت
2- وقتی فرم Release می کنم فرم قبلی مجدد Referesh می شود

با تشکر

ghabil
سه شنبه 13 شهریور 1386, 20:39 عصر
به عقب بر نگشتن دلیلش اینه که کدی کنترل شده که دکمه بک کار نکنه مگر اینکه کدهای مربوط به منیج کردن فرمها رو در سرور کنترل نوشته باشی توی اینونت OnBackButton (اگر درست یادم بیاد). (در غیر اینصورت کار کردن دکمه بک در یم وب اپلیکیشن میتونی خطر ساز باشه)
سوال دو رو هم نفهمیدم بیشتر توضیح بده ، کلا Manula اینتراوب رو دانلود کن و بخش مربوط به From Managmentش رو بخون توضیحاتش کامله