loading...
به روز ترین مطالب آموزشی
Mostafa.b بازدید : 26016 شنبه 30 فروردین 1393 نظرات (1)

آزادسازی حافظه اشغال شده ی بی مصرف برنامه

توسط Garbage Collector در Visual Basic

 


وقتی برنامه ای اجرا می شود اشیا به وجود می آیند و مقداری از حافظه  را به خود اختصاص می دهند. هنگامی که کار ما به یک شی تمام شد و شی را Dispose کردیم و یا زمانی که زمان حیات (Life Time)  یک شی به پایان رسید، حافظه اشغال شده توسط این شی بلا فاصله آزاد نمی شود و در حقیقت در این هنگام رویداد Finalize مربوط به شی،  فراخوانی نمی شود.

آزادسازی حافظه اشغال شده ی بی مصرف برنامه

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

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

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

در حالت عادی بهتر است که ما در کار زباله روب دخالت نکنیم و بگذاریم که . NET Framework وظیفه مدیریت حافظه رو بر عهده بگیرد. ولی در پاره ای از موارد ما احتیاج پیدا می کنیم که زباله روب را در هنگام اجرای برنامه فراخوانی کنیم تا راندمان و کارایی برنامه بالا برود

مثلا تصور کنید که برنامه ای داریم که هنگام اجرا، تعداد بسیار زیادی از اشیا را به وجود آورده و سپس آنها را آزاد می کند و عملکرد برنامه به صورتی است که نیاز داریم مدت زیادی در حال اجرا باشد. نتیجه این می شود که پس از مدتی حافظه بسیار زیادی توسط برنامه اشغال می شود که می تواند در کارایی سیستم و عملکرد سایر برنامه هایی که در حال اجرا هستند تأثیر منفی بگذارد.

در این گونه مواقع ما نیاز پیدا می کنیم که هر از چند گاهی درهنگام اجرای برنامه ، حافظه های اشغال شده ی  بی مصرف را آزاد کنیم و درحقیقت ، زباله روب را وادار سازیم تا این عمل را انجام دهد.

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

آزادسازی حافظه اشغال شده ی بی مصرف برنامه

یک پروژه از نوع Windows Application ایجاد کرده و دو دکمه به نام های btnAllocateObject و btnForceGarbageCollection  به فرم اضافه کنید.

در رویداد کلیک مربوط به دکمه btnAllocateObject  قطعه کد زیر را بنویسید.

' Create an object.

Private Sub btnAllocateObject_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAllocateObject.Click

Dim obj As New TestClass

obj.ObjectNumber = m_ObjectNumber

MessageBox.Show("Created object " & m_ObjectNumber)

m_ObjectNumber += 1

End Sub

همانطور که مشاهده می کنید ما یک شی از نوع کلاس TestClass که در ادامه به تشریح آن می پردازم ایجاد نموده  و عضو ObjectNumber آن را مقدار دهی می کنیم.

 

اکنون در رویداد کلیک مربوط به کنترل btnForceGarbageCollection قطعه کد زیر را بنویسید.

' Collect all garbage generations.

Private Sub btnForceGarbageCollection_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnForceGarbageCollection.Click

GC.Collect()

MessageBox.Show("Done")

End Sub

با اجرای دستود GC.Collect ، عمل زباله روبی (Garbage Collection) آغاز می گردد.

عمل زباله روب به این شکل است که متد Finalize مربوط به اشیایی که باید حافظه آن ها آزاد گردد را فراخوانی می کند.  برای نشان دادن این رویه، ما ساب روتین Finalize مربوط به کلاس TestClass را Override می کنیم.

Public Class TestClass

Public ObjectNumber As Integer

' Display a finalization message.

Protected Overrides Sub Finalize()

MyBase.Finalize()

MessageBox.Show("Finalizing " & ObjectNumber)

End Sub

End Class

کار تمام شد.

برای امتحان برنامه آن را اجرا کنید و چند دفعه دکمه btnAllocateObject  را کلیک کنید.  مشاهده می کنید که هر بار یک شی از نوع کلاس TestClass ایجاد شده و عضو ObectNumber آن مقدار دهی می شود.

اکنون دکمه btnForceGarbageCollection  را کلیک کنید. مشاهده می کنید که زباله روب در حقیقت متد Finalize هر یک از اشیایی که قبلا ایجاد نموده ایم را فراخوانی می کند و مقداری را که ما به عضو ObectNumber هر شی اختصاص دادیم را مشاده می کنید.

 

مطالب مرتبط
ارسال نظر برای این مطلب
این نظر توسط پریسا در تاریخ 1393/01/31 و 1:38 دقیقه ارسال شده است

نکته خوبی بود


کد امنیتی رفرش
اطلاعات کاربری
  • فراموشی رمز عبور؟
  • آرشیو
    آمار سایت
  • کل مطالب : 101
  • کل نظرات : 38
  • افراد آنلاین : 1
  • تعداد اعضا : 1
  • آی پی امروز : 3
  • آی پی دیروز : 1
  • بازدید امروز : 15
  • باردید دیروز : 2
  • گوگل امروز : 0
  • گوگل دیروز : 0
  • بازدید هفته : 25
  • بازدید ماه : 260
  • بازدید سال : 1,417
  • بازدید کلی : 7,365,877