Garbage Collector چیست؟
#1
Note 
[ATTACH=CONFIG]364[/ATTACH]

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


متد Finalize چیست؟
Finalize متد ویژه ای است که Garbage Collector قبل از خارج کردن شی از درون Heap Memory آن را فراخوانی می نماید. این متد کم و بیش شبیه رویداد Class_Terminate در Visual Basic 6 می باشد. اما تفاوت هایی نیز وجود دارد. در VB6 بلافاصله بعد از قرار دادن شی به Nothing شی رویداد Class_Terminate را فراخوانی می نماید ولی حال این قضیه صادق نمی باشد.
به طور کل تمامی اشیاء موجو در .NET Framework متد Finalize را از کلاس System.Object به ارث می برند به همین دلیل در زمان استفاده از متود Finalize دو خصوصیت Protected و Overrides را به کار برید.

آزاد سازي حافظه هاي اشغال شده بي مصرف، توسط زباله روب انجام مي شود.
زباله روب معمولا در دو حالت شروع به آزاد سازي حافظه اشغال شده مي کند.

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

زماني که اجراي برنامه به پايان مي رسد که در اين حالت زباله روب شروع به کار کرده و کل حافظه اي که توسط برنامه اشغال شده بود را آزاد مي کند.
در حالت عادي بهتر است که ما در کار زباله روب دخالت نکنيم و بگذاريم که .DotNET Framework وظيفه مديريت حافظه رو بر عهده بگيرد ولي در پاره اي از موارد ما احتياج پيدا مي کنيم که زباله روب را در هنگام اجراي برنامه فراخواني کنيم تا راندمان و کارايي برنامه بالا برود.

[ATTACH=CONFIG]362[/ATTACH]

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


منابع:
ecl4u.com
barnamenevis.org
codeproject.com
جمع اوری: softafzar.net

پاسخ
ایجاد موضوع جدید   پاسخ به موضوع  

موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
Note CLR چیست؟ SOFTAFZAR 0 735 19-11-2012 ساعت 14:26
آخرین ارسال: SOFTAFZAR

کاربرانِ درحال بازدید از این موضوع:   1 مهمان