زباله روب معمولا در دو حالت شروع به آزاد سازی حافظه اشغال شده می کند:
**در حین اجرای برنامه زمانی که برنامه نیاز به حافظه جدیدی داشته باشد و با کمبود حافظه آزاد روبرو شود، زباله روب شروع به کار کرده و تمام حافظه هایی که توسط برنامه اشغال شده اند را نشانه گذاری می کند. گروهی از این حافظه ها در حال حاضر توسط برنامه در حال استفاده هستند و گروهی دیگر قبلا استفاده شده اند و اکنون دیگر قابل دسترسی و استفاده نیستند. (مانند اشیایی که در یک ساب روتین ایجاد شده اند و فراخوانی ساب روتین به پایان رسیده باشد). پس از اینکه نشانه گذاری به پایان رسید، زباله روب شروع به آزاد سازی حافظه هایی که به عنوان حافظه اشغال شده بی مصرف ، نشانه گذاری شده اند می کند.
** زمانی که اجرای برنامه به پایان می رسد که در این حالت زباله روب شروع به کار کرده و کل حافظه ای که توسط برنامه اشغال شده بود را آزاد می کند.
مثلا تصور کنید که برنامه ای داریم که هنگام اجرا، تعداد بسیار زیادی از اشیا را به وجود آورده و سپس آنها را آزاد می کند و عملکرد برنامه به صورتی است که نیاز داریم مدت زیادی در حال اجرا باشد. نتیجه این می شود که پس از مدتی حافظه بسیار زیادی توسط برنامه اشغال می شود که می تواند در کارایی سیستم و عملکرد سایر برنامه هایی که در حال اجرا هستند تأثیر منفی بگذارد.
در این گونه مواقع ما نیاز پیدا می کنیم که هر از چند گاهی درهنگام اجرای برنامه ، حافظه های اشغال شده ی بی مصرف را آزاد کنیم و درحقیقت ، زباله روب را وادار سازیم تا این عمل را انجام دهد.
در این قسمت برنامه ای خواهیم نوشت که مطالب فوق را در بر گرفته و نحوه پیاده سازی آن رانشان خواهیم داد.
یک پروژه از نوع 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 هر شی اختصاص دادیم را مشاده می کنید.