天天看點

一文帶你了解Java 中的垃圾回收機制(2)

另外,提供以下方法-

用于初始化名稱和年齡的參數化構造函數。ID 應在此構造函數中初始化。

顯示 ID、姓名和年齡的方法 show()。

顯示下一個員工的 ID 的方法 showNextId()。

現在對垃圾回收機制不了解的初學者可能會這樣編寫代碼:

//計算在公司工作的員勞工數的程式

class Employee
{
    private int ID;
    private String name;
    private int age;
    private static int nextId=1;
    //它是靜态的,因為它在所有對象之間保持通用并由所有對象共享
    public Employee(String name,int age)
    {
        this.name = name;
        this.age = age;
        this.ID = nextId++;
    }
    public void show()
    {
        System.out.println
        ("Id="+ID+"\nName="+name+"\nAge="+age);
    }
    public void showNextId()
    {
        System.out.println
        ("Next employee id will be="+nextId);
    }
}
class UseEmployee
{
    public static void main(String []args)
    {
        Employee E=new Employee("GFG1",33);
        Employee F=new Employee("GFG2",45);
        Employee G=new Employee("GFG3",25);
        E.show();
        F.show();
        G.show();
        E.showNextId();
        F.showNextId();
        G.showNextId();
            
            { //這是保留所有實習生的子塊。
            Employee X=new Employee("GFG4",23); 
            Employee Y=new Employee("GFG5",21);
            X.show();
            Y.show();
            X.showNextId();
            Y.showNextId();
        }
        //這個大括号之後,X 和 Y 将被移除。是以現在它應該顯示 nextId 為 4。
        E.showNextId();//這一行的輸出應該是 4,但它會給出 6 作為輸出。
    }
}

      

輸出:

一文帶你了解Java 中的垃圾回收機制(2)

現在獲得正确的輸出:

現在垃圾收集器(gc)将看到 2 個空閑的對象。現在遞減 nextId,gc(garbage collector) 隻會在我們的程式員在我們的類中覆寫它時調用方法 finalize() 。如前所述,我們必須請求 gc(garbage collector),為此,我們必須在關閉子塊的大括号之前編寫以下 3 個步驟。

将引用設定為 null(即 X = Y = null;)

調用,System.gc();

調用,System.runFinalization();

現在計算員勞工數的正确代碼(不包括實習生)

// 計算不包括實習生的員勞工數的正确代碼
class Employee
{
    private int ID;
    private String name;
    private int age;
    private static int nextId=1;
    //它是靜态的,因為它在所有對象之間保持通用并由所有對象共享
    public Employee(String name,int age)
    {
        this.name = name;
        this.age = age;
        this.ID = nextId++;
    }
    public void show()
    {
        System.out.println
        ("Id="+ID+"\nName="+name+"\nAge="+age);
    }
    public void showNextId()
    {
        System.out.println
        ("Next employee id will be="+nextId);
    }
    protected void finalize()
    {
        --nextId;
        //在這種情況下,gc 會為 2 個對象調用 finalize() 兩次。
    }
}

// 它是 Employee 類的右括号
class UseEmployee
{
    public static void main(String []args)
    {
        Employee E=new Employee("GFG1",33);
        Employee F=new Employee("GFG2",45);
        Employee G=new Employee("GFG3",25);
        E.show();
        F.show();
        G.show();
        E.showNextId();
        F.showNextId();
        G.showNextId();
            
        {
            //這是保留所有實習生的子塊。
            Employee X=new Employee("GFG4",23); 
            Employee Y=new Employee("GFG5",21);
            X.show();
            Y.show();
            X.showNextId();
            Y.showNextId();
            X = Y = null;
            System.gc();
            System.runFinalization();
        }
    E.showNextId();
    }
}

      
一文帶你了解Java 中的垃圾回收機制(2)