در اين مقاله به طور خلاصه به نحوه عملکرد زباله روب (Garbage Collector) و استفاده از آن در برنامه مي پردازم.
وقتي برنامه اي اجرا مي شود اشيا به وجود مي آيند و مقداري از حافظه را به خود اختصاص مي دهند.
هنگامي که کار ما به يک شي تمام شد و شي را Dispose کرديم و يا زماني که زمان حيات (Life Time) يک شي به پايان رسيد، حافظه اشغال شده توسط اين شي بلا فاصله آزاد نمي شود و در حقيقت در اين هنگام رويداد Finalize مربوط به شي، فراخواني نمي شود.
آزاد سازي حافظه هاي اشغال شده بي مصرف، توسط زباله روب انجام مي شود.
زباله روب معمولا در دو حالت شروع به آزاد سازي حافظه اشغال شده مي کند.
-
در حين اجراي برنامه زماني که برنامه نياز به حافظه جديدي داشته باشد و با کمبود حافظه آزاد روبرو شود، زباله روب شروع به کار کرده و تمام حافظه هايي که توسط برنامه اشغال شده اند را نشانه گذاري مي کند. گروهي از اين حافظه ها در حال حاضر توسط برنامه در حال استفاده هستند و گروهي ديگر قبلا استفاده شده اند و اکنون ديگر قابل دسترسي و استفاده نيستند. (مانند اشيايي که در يک ساب روتين ايجاد شده اند و فراخواني ساب روتين به پايان رسيده باشد). پس از اينکه نشانه گذاري به پايان رسيد، زباله روب شروع به آزاد سازي حافظه هايي که به عنوان حافظه اشغال شده بي مصرف ، نشانه گذاري شده اند مي کند.
-
زماني که اجراي برنامه به پايان مي رسد که در اين حالت زباله روب شروع به کار کرده و کل حافظه اي که توسط برنامه اشغال شده بود را آزاد مي کند.
در حالت عادي بهتر است که ما در کار زباله روب دخالت نکنيم و بگذاريم که .DotNET 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 هر شي اختصاص داديم را مشاده مي کنيد.
مثال انجام شده در اين مقاله از لينک بالاي مقاله قابل دانلود مي باشد.
منبع : Vb-Helper