PDA

View Full Version : سوال: افزایش استفاده از حافظه



damanpak
چهارشنبه 21 اسفند 1392, 21:41 عصر
سلام به همگی
دوستان یک سوالی امروز برام پیش اومد
بنده در نرم افزارهام دقت کردم که وقتی فرم های مربوط به برنامه ام رو باز میکنم در Task Manager سربرگ Processes مقدار ستون Memory(Private Working Set) هرلحظه بیشتر میشه
مثلا در ابتدای برنامه هست 18,200 و هرچی فرمهای برنامه رو باز میکنم و عملیاتی انجام میدم این مقدار بیشتر میشه مخصوصا فرم هایی که یک کم پروسه سنگین تری دارن این مقدار خیلی زیاد میشه.
مثلا چندین فرم و که باز کردم و چندکار انجام دادم از 18,200 رسید به 50,720 اما بعد بستن اون فرم این مقدار دوباره کم نشد
چه راهی وجود داره که بعد بستن فرم مربوطه به همون میزان که مقدار حافظه اضافه شد دوباره ازش کم بشه؟

محمد آشتیانی
چهارشنبه 21 اسفند 1392, 23:21 عصر
سلام

برای آزاد سازی حافظه ای که توسط برنامه استفاده شده و البته بعد از استفاده آزاد نشده باید از کلاس GC - Garbage Collection استفاده کنی

نحوه استفادش هم بصورت ساده این دستوره


GC.Collect()

این در واقع حافظه بلا استفاده ای که توسط برنامه اشغال شده رو آزاد میکنه

توضیحات کامل این کلاس توی سایت MSDN
http://msdn.microsoft.com/en-us/library/System.GC_methods(v=vs.110).aspx


امیدوارم مفید باشه / موفق باشید

damanpak
پنج شنبه 22 اسفند 1392, 08:05 صبح
سلام و تشکر از پاسختون
خب ازین دستور چه زمانی باید استفاده کنم؟
توی رویداد بسته شدن فرم برنامه؟
آیا استفاده مکرر از این دستور ازین دستور مشکلی بوجود میاره؟
ممنون میشم اگه یک نمونه مثال هم بزنید

محمد آشتیانی
پنج شنبه 22 اسفند 1392, 12:22 عصر
سلام

فرقی نمیکنه چه زمانی استفاده بشه ، چون وقتی شما متد GC.Collect رو استفاده میکنی ، تاثیرش رو کل حافظه استفاده شده توسط برنامست
خب البته طبیعتا بهتره بعد از عملیات سنگینی که میدونی استفاده از حافظه توش زیاده و یا نهایتا موقع بستن فرم ازش استفاده کنی
استفاده مکرر هم مشکلی بوجود نمیاره


کاربردش خیلی سادست ، این مثال تو همون لینکی که تو پست قبل دادم بود



Class MyGCCollectClass
Private Const maxGarbage As Integer = 1000


Shared Sub Main()
'Put some objects in memory.
MyGCCollectClass.MakeSomeGarbage()
Console.WriteLine("Memory used before collection: {0:N0}",
GC.GetTotalMemory(False))


'Collect all generations of memory.
GC.Collect()
Console.WriteLine("Memory used after full collection: {0:N0}",
GC.GetTotalMemory(True))
End Sub


Shared Sub MakeSomeGarbage()
Dim vt As Version


Dim i As Integer
For i = 0 To maxGarbage - 1
'Create objects and release them to fill up memory with unused objects.
vt = New Version()
Next
End Sub
End Class


موفق باشید