جمع آوري زباله Garbage collection
جمع آوري زباله Garbage collection
از آنجاييكه اشيائ بصورت پويا و با استفاده از عملگر new تخصيص مي يابند
ممكن است تعجب كنيد كه چگونه اين اشيائ خراب شده و حافظه آنها آزاد شده و
مجددا" تخصيص مي يابد . در برخي زبانها ، نظير C++ ، اشيائ تخصيص يافته پويا
بايد بصورت دستي و با استفاده از عملگر delete رها شوند . جاوا در اين مورد
روش متفاوتي دارد. جاوا اينكار را بصورت خودكار براي شما انجام مي دهد. تكنيكي
كه تخصيص مجدد اشيائرا انجام ميدهد،اصطلاحا" جمع آوري زباله garbage collection
ناميده مي شود. طرز كار آن بشرح بعدي مي باشد : وقتي كه هيچگونه ارجاعي به يك
شي ئ وجود نداشته باشد، فرض مي شود كه آن شي ئ نيازي به خراب كردن اشيائ بصراحت
نظير زبان C++ وجود ندارد . جمع آوري زباله طي اجراي برنامه شما فقط بصورت
پراكنده و گاه و بيگاه اتفاق مي افتد ( البته اصلا" اگر اتفاق بيفتد ) . اين
جريان بخاطر اينكه يك يا دو شي ئ وجود دارند كه ديگر استفاده نمي شوند ، اتفاق
نمي افتد . بعلاوه ، پياده سازيهاي گوناگون حين اجراي جاوا ، شيوه هاي متفاوتي
در جمع آوري زباله بوجود مي آورد، اما در غالب اوقات هنگام نوشتن برنامه هايتان اين موضوع نگراني نداشته باشيد .
روش ()finalize
گاهي لازم است تا يك شي ئ هنگاميكه در حال خراب شدن است ، يك عمل خاصي را
انجام دهد. بعنوان مثال ، ممكن است يك شي ئ دربرگيرنده منابع غير جاوا نظير يك
دستگيره فايل (file handle) يا فونت كاراكتر ويندوز باشد، و مي خواهيد اطمينان
يابيد كه قبل از اينكه آن شي ئ خراب شود ، منابع فوق آزاد شوند . براي اداره
چنين شرايطي ، جاوا مكانيسمي تحت نام finalization ( تمام كننده ) فراهم آورده
است .
با استفاده از اين مكانيسم ، مي توانيد عمليات مشخصي را تعريف نماييد كه
زمانيكه يك شي ئ در شرف مرمت شدن توسط جمع آوري زباله است ، اتفاق بيفتند .
براي افزودن يك تمام كننده (finalizer) به يك كلاس ، خيلي راحت كافي است تا
روش ()finalize را تعريف نماييد. سيستم حين اجراي جاوا هرگاه در شرف چرخش مجدد
يك شي ئ از كلاسي باشد ، اين روش را فراخواني مي كند . داخل روش ()finalize شما
عملياتي را مشخص مي كنيد كه بايد درست قبل از خرابي آن شي ئ انجام گيرند . جمع
كننده زباله (garbage collector) بطور متناوب اجرا شده و بدنبال اشيايي ميگردد
كه ديگر مورد ارجاع هيچيك از شرايط اجرايي نبوده و يا غير مستقيم توسط ساير
اشيائ ارجاع شده باشند . درست قبل از اينكه يك داراي رها شود، سيستم حين اجراي
جاوا روش ()finalize را روي شي ئ فراخواني مي كند .
شكل عمومي روش ()finalize بقرار زير مي باشد :
protected void finalize)(
{
// finalization code here
}
دراينجا واژه كليدي protected توصيفگري است كه از دسترسي به روش ()finalize
توسط كدهاي تعريف شده خارج از كلاس جلوگيري مي كند.
مهم است بدانيد كه روش ()finalize درست مقدم بر جمع آوري زباله فراخواني
مي شود . بعنوان مثال وقتي يك شي ئ از قلمرو خارج مي شود ، اين روش فراخواني
نخواهد شد.اين بدان معني است كه نميتوانيد تشخيص بدهيد كه چه زماني ()finalize
اجرا خواهد شد و يا اصلا" اجرا نخواهد شد . بنابراين ، برنامه شما بايد ساير
وسائل براي آزاد كردن منابع سيستم مورد استفاده شي ئ را تدارك ببيند . برنامه
نبايد براي عمليات برنامه اي عادي ، متكي به روش ()finalize باشد .
نكته : اگر با C++ آشنايي داريد، پس مي دانيد كه C++ امكان مي دهد تا يك خراب
كننده (destructor) براي يك كلاس تعريف نماييد ، كه هرگاه يك شي ئ خارج
از قلمرو قرار گيرد ، فراخواني خواهد شد . جاوا چنين كاري نكرده و از
اين ايده پشتيباني نمي كند . روش ()finalize فقط به يك تابع خراب كننده
نزديك مي شود. به مرور كه تجربه بيشتري با جاوا كسب مي كنيد ، مي بينيد
كه نياز به توابع خراب كننده بسيار كم است زيرا زير سيستم جمع آوري حسن انجام مي دهد
مهندسی نرم افزار کامپیوتر