View Full Version : آزاد شدن حافظه
seyed_farid
پنج شنبه 29 مهر 1389, 18:30 عصر
با سلام
اگر در پروسیجری چند متغیر تعریف کنیم و در وسط دستورات پروسیجر با شرط خاصی از دستور Exit استفاده کنیم که دیگر نخواهد بقیه شروط و دستورات را مرور کند، آیا حافظه تخصیص داده شده به متغیرها در این بخش بصورت خودکار آزاد میشوند یا باید خودمان دستور آزادیشان را بدهیم؟
و دیگر اینکه وقتی از دیتابیس اکسس استفاده میکنیم و تیبل، آیا باز بودن جدول بصورت همیشگی در طول اجرای برنامه، در حافظه اثر زیادی دارد و باید بسته شود و فقط در لحظه خواندن و نوشتن در جدول باید باز باشد؟:تشویق:
tdkhakpur
پنج شنبه 29 مهر 1389, 18:49 عصر
اگر در پروسیجری چند متغیر تعریف کنیم و در وسط دستورات پروسیجر با شرط خاصی از دستور Exit استفاده کنیم که دیگر نخواهد بقیه شروط و دستورات را مرور کند، آیا حافظه تخصیص داده شده به متغیرها در این بخش بصورت خودکار آزاد میشوند یا باید خودمان دستور آزادیشان را بدهیم؟
اگر حافظه رو بصورت داینامیک رزرو کرده باشید حافظه آزاد نمیشه باید خودتان قبل از خروج آزاد کنید
و دیگر اینکه وقتی از دیتابیس اکسس استفاده میکنیم و تیبل، آیا باز بودن جدول بصورت همیشگی در طول اجرای برنامه، در حافظه اثر زیادی دارد و باید بسته شود و فقط در لحظه خواندن و نوشتن در جدول باید باز باشد؟
باز بودن دیتابیس تقریبا اثری در کمبود حافظه ایجاد نمیکنه وقتی داده ای خواسته میشه حافظه رزرو میشه و میتوانید تا زمان خروج از برنامه دیتابیس باز بمونه.
Felony
پنج شنبه 29 مهر 1389, 19:04 عصر
اگر در پروسیجری چند متغیر تعریف کنیم و در وسط دستورات پروسیجر با شرط خاصی از دستور Exit استفاده کنیم که دیگر نخواهد بقیه شروط و دستورات را مرور کند، آیا حافظه تخصیص داده شده به متغیرها در این بخش بصورت خودکار آزاد میشوند یا باید خودمان دستور آزادیشان را بدهیم؟
آزاد کردم متغییرهای تعریف شده به عهده خود کامپایلر دلفی هست مگر اینکه اشاره گری تعریف کرده باشید و به وسیله تابع GetMem بهش حافظه ای اختصاص داده باشید ، اون وقت آزاد کردن حافظه اشغال شده به عهده شماست .
seyed_farid
پنج شنبه 29 مهر 1389, 19:36 عصر
مثلا این دستورات:
procedure TForm1.Receive(SenderIP ,GMessage : String );
var TextLen,Len :integer;
S : String;
begin
if LeftStr(GMessage,5)= 'A3TN5' then
begin
// دستورات....
.
.
.
Exit;
end;
.
دستورات دیگر
.
End;
تو این حالت حافظه اختصاصی به TextLen,Lenو S آزاد میشود؟
چون تو برنامه این پروسیجر که خیلی طولانی است و حالتهای زیادی چک میشود به سرعت زیادی تکرار میشود.
Felony
پنج شنبه 29 مهر 1389, 19:40 عصر
بله ، گفتم که آزاد شدن متغییرهای معمول به عهده خود کامپایلر دلفی هست .
seyed_farid
یک شنبه 30 آبان 1389, 17:04 عصر
با سلام
من يه برنامه نوشتم كه بعد از گذشت حدود 20 روز از اجراش ، ويندوز پيغام Low Sufficient virtual memory ميدهد و برنامه هنگ ميشه و بسته ميشود. دوستان كسي ميدونه مشكل چيه؟:متفکر:
البته جديداً هم متوجه شدم كه برنامه كه درحال اجراست ، فايل اجرائي آن را ميتوني تغيير نام و يا پاك كنم و اين يعني اينكه برنامه از جاي ديگري اجرا ميشه و اين فايل فقط صدا زننده است و من حدس ميزنم كه ويروسي باشه با اين قابليت كه خودشو تو فايل اجرائيم اضافه كرده و اول خودشو اجرا ميكنه و بعد هم فايل اجرائي منو اجرا ميكنه.:گریه:
كسي با اين مورد برخورد كرده و راه حلش چيه؟:کف:
ضمنا من از نود آنتي ويروس استفاده ميكنم. البته با آويرا هم چك كردم ولي چيزي پيدا نكرده.
seyed_farid
چهارشنبه 03 آذر 1389, 20:33 عصر
این هم پیغام خطای مورد نظر.
کسی میتونه کمک کنه؟:کف:
Felony
چهارشنبه 03 آذر 1389, 20:40 عصر
این هم پیغام خطای مورد نظر.
کسی میتونه کمک کنه؟:کف:
خوب مشکل کجاست ، همه چی تو اون پیغام خطا به صورت واضح شرح داده شده ، حافظه مجازی شما برای ادامه اجرای برنامه کم هست و بهتون پیشنهاد داده شده تا حافظه مجازی رو افزایش بدید ، برای تغییر اندازه حافظه مجازی در ویندوز XP به لینک زیر مراجعه کنید :
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/sysdm_advancd_perform_change_vmpagefile.mspx?mfr=t rue
seyed_farid
جمعه 24 دی 1389, 22:13 عصر
با افزايش حافظه ففط كمي بيشتر برنامه كار مي كند ولي باز پس از مدتي آن پيغام خطا ظاهر مي شود.
جايي گفته بودند براي آزاد كردن حافظه هر يكروز از اين كد استفاده كن تا مقدار حافظه آزاد شود.
SetProcessWorkingSetSize(GetCurrentProcess, dword(-1), dword(-1));
ولي اين هم جوابگو نيست.
اين كد را هم براي بدست آوردن اطلاعات Virtual Memory پيدا كردم اما درست نفهميدم كه مي شه ازش استفاده مطلوبي كنم يا نه؟
procedure TForm1.Button1Click(Sender: TObject)
var MemoryStatus: TMemoryStatus;
begin
Memo1.Lines.Clear;
MemoryStatus.dwLength := SizeOf(MemoryStatus) ;
GlobalMemoryStatus(MemoryStatus) ;
with MemoryStatus do begin
Memo1.Lines.Add(IntToStr(dwLength) +
' Size of ''MemoryStatus'' record') ;
Memo1.Lines.Add(IntToStr(dwMemoryLoad) +
'% memory in use') ;
Memo1.Lines.Add(IntToStr(dwTotalPhys) +
' Total Physical Memory in bytes') ;
Memo1.Lines.Add(IntToStr(dwAvailPhys) +
' Available Physical Memory in bytes') ;
Memo1.Lines.Add(IntToStr(dwTotalPageFile) +
' Total Bytes of Paging File') ;
Memo1.Lines.Add(IntToStr(dwAvailPageFile) +
' Available bytes in paging file') ;
Memo1.Lines.Add(IntToStr(dwTotalVirtual) +
' User Bytes of Address space') ;
Memo1.Lines.Add(IntToStr(dwAvailVirtual) +
' Available User bytes of address space') ;
end;
end;
دوستان كسي ميتونه كمك كنه مشكل برنامه ما هم حل بشه؟:تشویق:
در مورد اون ويروس احتمالي كه گفتم برنامه ام كه در حال اجراست را فايلش را مي تواني تغيير نام بدهيم كسي چيزي نميدونه؟:گیج:
Felony
شنبه 25 دی 1389, 00:09 صبح
دوستان كسي ميتونه كمك كنه مشكل برنامه ما هم حل بشه؟
اینطوری نمیشه کمکی بهتون کرد ، باید برنامتون رو قرار بدید یا توضیحات کاملی ارائه کنید .
vcldeveloper
شنبه 25 دی 1389, 00:36 صبح
جايي گفته بودند براي آزاد كردن حافظه هر يكروز از اين كد استفاده كن تا مقدار حافظه آزاد شود.
بیخود گفته؛ اون دردی از شما دوا نمیکنه.
من يه برنامه نوشتم كه بعد از گذشت حدود 20 روز از اجراش ، ويندوز پيغام Low Sufficient virtual memory ميدهد و برنامه هنگ ميشه و بسته ميشود. دوستان كسي ميدونه مشكل چيه؟
مشکل که با این اطلاعاتی که شما دادید، به نظر Memory leak هست. مسئله شما این هست که پیدا کنید در کجای کد دارید Memory Leak میدید. آخرین نسخه FastMM را دانلود کنید، و ازش به عنوان Memory Manager استفاده کنید. FastMM را در حالت FullDebugMode قرار بدید، و برنامه را اجرا کنید، و مدتی با بخش های مختلف اون کار کنید (ممکنه لازم باشه که برنامه شما چندین ساعت در همون حالتی که در سیستم مقصد کار میکنه، کار کنه)، و نهایتا ببندیدش ببینید FastMM چه Memory Leak هایی رو گزارش میکنه.
seyed_farid
یک شنبه 26 دی 1389, 13:53 عصر
ممنون آقاي كشاورز:قلب:
ميشه در مورد اين برنامه بيشتر توضيح بديد و طرز استفادش رو اگر داريد با يك نمونه يا مثال بيان كنيد.:تشویق:
لينك دانلودش را داريد؟
vcldeveloper
یک شنبه 26 دی 1389, 14:42 عصر
ميشه در مورد اين برنامه بيشتر توضيح بديد
FastMM یک برنامه نیست، بلکه یک مدیر حافظه اوپن سورس برای دلفی هست که نسبت به مدیر حافظه بورلند هم سرعت بسیار بالاتری داره، و هم امکانات دیباگ بیشتری داره. FastMM در نسخه های جدید دلفی مدیرحافظه پیش فرض برنامه هست، اما در نسخه های قدیمی تر دلفی (مثل دلفی 7) باید خودتون یونیتش را به فایل پروژه اضافه کنید. FastMM یک حالت FullDebugMode داره که برای استفاده از اون، باید نسخه کامل FastMM را از سایتش دانلود کنید (چون در نسخه پیش فرض موجود در دلفی DLL مربوط به FullDebugMode وجود نداره). چگونگی استفاده از قابلیت های آن در فایل راهنمای خودش مفصلا توضیح داده شده.
لينك دانلودش را داريد؟
http://sourceforge.net/projects/fastmm/
seyed_farid
دوشنبه 27 دی 1389, 08:21 صبح
ممنون آقاي كشاورز
من نتونستم ازش نتيجه بگيرم.:خجالت:
نمونه برنامه ازش نداريد؟:کف:
Felony
دوشنبه 27 دی 1389, 09:16 صبح
ممنون آقاي كشاورز
من نتونستم ازش نتيجه بگيرم.:خجالت:
نمونه برنامه ازش نداريد؟:کف:
نمونه برنامه چی ؟!!
seyed_farid
دوشنبه 27 دی 1389, 14:43 عصر
نمونه برنامه اي كه از FastMM استفاده كنه .:چشمک:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.