چگونه از توابع مخرب یا destructor در Java استفاده کنیم

توابع مخرب یا destructor کاربرد زیادی در مدیریت حافظه برنامه های نوشته شده در C++ دارند. عموما در مورد کلاسهای طراحی شده، با استفاده از این متد به آزاد سازی حافظه پرداخته میشود.

javalogo

اما در زبانی مانند جاوا که مدیریت حافظه در اختیار ماشین مجازی میباشد، استفاده از این تابع چندان منطقی نیست، با این حال امکان پیاده سازی آن با استفاده از تابع finalize فراهم شده است.

برای انجام این کار در کلاس مربوطه یک تابع به نام finalize پیاده سازی گشته و سیستم Garbage Collector در زمان اتمام استفاده از کلاس و آزاد سازی تمام ارجاعات آن، تابه finalize را فراخوانی مینماید.

از آنجا که زمان عملکرد Grabage Collector نا مشخص است، با استفاده از دستورات gc و runFinalization میتوان ماشین مجازی را ملزم به آزاد سازی حافظه (جمع آوری زباله ها از حافظه) نمود.

مثال زیر نحوه انجام این کار را نشان میدهد:

import java.util.ArrayList;

public class Samples  {
    public static void main(String[] args){
        long mem = Runtime.getRuntime().freeMemory();

        SampleClass c1 = new SampleClass();
        SampleClass c2 = new SampleClass();
        SampleClass c3 = new SampleClass();

        System.out.println(String.format("Used memory: %d KB", (mem - Runtime.getRuntime().freeMemory())/1024));
        mem = Runtime.getRuntime().freeMemory();

        c1 = c2 = c3 = null;

        System.gc();
        System.runFinalization();

        System.out.println(String.format("Released memory: %d KB", (Runtime.getRuntime().freeMemory() - mem)/1024));
    }
}

class SampleClass {
    private ArrayList<Double> _obj;

    public SampleClass() {
        _obj = new ArrayList<Double>();
        for (int i=0; i<1000000; i++)
            _obj.add(Math.random());

        System.out.println("Created");
    }

    public void finalize() {
        _obj.clear();
        _obj = null;
        System.out.println("Finalized");
    }

}

خروجی احتمالی برنامه به این صورت است. بدیهیست که سیستم Garbage Collector هیچ تضمینی جهت مصرف یا آزاد سازی دقیق میزان حافظه ندارد.

Created
Created
Created
Used memory: 62354 KB
Finalized
Finalized
Finalized
Released memory: 11123 KB

About محمد شمس

برنامه‌نویس، طراح انیمیشن و علاقمند به هوش مصنوعی

پاسخ دهید