PDA

View Full Version : سوال: تفاوت متد های System.gc و finalize ؟



esmaeilbf
شنبه 25 خرداد 1392, 15:44 عصر
تفاوت متدهای System.gc و finalize چیه؟چه موقع باید ازشون استفاده کرد؟

cups_of_java
یک شنبه 26 خرداد 1392, 00:32 صبح
System.gc برای این هست که شما به محیط اجرای برنامت بگی "آشغال جمع کنش" (Garbage Collector) رو اجرا کنه. البته اون خودش تصمیم میگیره که شما وقتی این متد رو فراخوانی کردی، این کار رو بکنه یا نکنه! یعنی ممکنه Garbage Collector رو اجرا نکنه.
و اما finalize یک متد هست توی کلاس Object که شما در صورت نیاز توش رو پیاده سازی می کنی. این متد وقتی Garbage Collector اجرا بشه، برای تمام شی هایی که لازم هست جمع آوری بشن از تو حافظه فراخوانی میشه تا اعلام کنه که وقت جمع آوری رسیده. بنابر این شما از این متد می تونی استفاده کنی تا منابع باز یا فایل های باز یا هر چیزی که تو برنامت توسط اشیات اشغال کردی رو آزاد کنی.
طبیعی هست که تضمیینی برای اجرا شدن finalize نیست چون ممکنه Garbage Collector اصن اجرا نشه! بنابراین این راه استاندارد و تضمینی و درستی برای این کار نیست.

در مجموع استفاده از این دو تا متد تو برنامه های جاوا توصیه نمیشه. برنامه شما نباید وابسته به این تیپ فراخوانی ها باشه.

esmaeilbf
یک شنبه 26 خرداد 1392, 11:19 صبح
ممنون از پاسخ کاملتون .

در مجموع استفاده از این دو تا متد تو برنامه های جاوا توصیه نمیشه. برنامه شما نباید وابسته به این تیپ فراخوانی ها باشه.
توصیه نمیشه!! پس چه روشهایی برای آزاد سازی منابع اشغال شده توسط object ها باید استفاده کنیم؟

cups_of_java
یک شنبه 26 خرداد 1392, 11:47 صبح
ببین finalize یک متدی هست که به طور اتوماتیک توسط JRE موقع اجرای GC روی اشیایی که آماده جمع شدن باشن فراخوانی میشه! این اتوماتیک بودن و احتمالی بودن داستان علت اون توصیه نشدنست و اینکه برنامه شما به هیچ وجه نباید به اجرا شدن GC وابسته باشه!‌ برنامه باید بدون اجرا شدن GC هم منابع خودش رو خودش مدیریت کنه! بنابراین
همونطور که شما توی هر شی Constructor داری و متد های دست نویس خودتو داری که فایل باز می کنن و کانکشن به دیتابیس می زنن و ... به همون شکل هم باید متد های دست نویسی که این ها رو جمع می کنن داشته باشی.
کدی که داره شی ای از اون کلاس شما ایجاد می کنه باید وقتی دیگه نبازی به اون شی نداشت خودش متد جمع کردنش رو هم روی اون شی فراخوانی کنه. (همون متدی که بالا گفتم باید بنویسی)
به کلاس های File و Connection‌و اینا نگاه کن...! همشون متد هایی مثل close و .... اینا دارن که منابع رو جمع می کنن. شی شما هم یه چیزی مثل اونا می تونه باشه!

این فلسفه انجام اینکار هست،‌اما اصولن شما توی برنامت از کتابخانه ها و فریم ورک هایی استفاده می کنی که خودشون Connection Pool دارن یا می تونن اشیا رو مدیریت کنن و این کار دیگه به عهده برنامه شما نیست. فریم ورک ها اساسن یکی از وظایفشون همین چیزاست. البته به هر حال یه جاهایی نیاز می شه خودت هم اینکار رو بکنی.