Java 清理和垃圾回收

java.lang.ref.cleaner包

finalize()//該方法已過期,有風險,慎用

1.對象不可能被垃圾回收java

2.垃圾回收並不等於"析構"post

只有當垃圾回收發生時finalize()才獲得調用,不然對象就會一直保存下來,知道程序結束,將資源交還系統this

3.垃圾回收只與內存又關,垃圾回收和終結都不保證會必定發生  //可使用system.gc() 提醒 虛擬機回收spa

System.runFinalization(); //強制調用已經失去引用的對象的finalize方法 code

可使對象引用指向null強制對象失去引用對象

//: object/TerminationCondition.java /**@version 1.0 * @author fei long */
package object; class Book { boolean checkedOut = false; Book(boolean checkOut) { checkedOut = checkOut; } void checkIn() { checkedOut =false; } protected void finalize() { if(checkedOut) { System.out.println("Error: checked out"); } } } public class TerminationCondition{ public static void main(String[] args) { Book novel = new Book(true); novel.checkIn(); new Book(true); System.gc(); //提醒虛擬機回收
System.runFinalization();//強制調用已經失去引用的對象的finalize方法  } }
/* output Error: checked out *///~

 繼承和清理: 經過組合和繼承方法來建立新類時,永遠沒必要擔憂對象的清理爲你,子類一般留給垃圾回收器進行處理,若是遇到清理的問題,那麼必須爲新類建立dispose()方法,而且因爲繼承的緣故,若是咱們有其它做爲垃圾回收一部分的特殊清理動做,就必須在導出類中覆蓋dispose方法,當覆蓋被繼承類的dispose()方法時,務必調用基類版本的dispose()方法,不然基類的清理動做就不會發生,blog

//: polymorphism/Forg.java // cleanup an inheritance
package object; import static net.mindview.util.Print.*; class Characteristic{ private String s; Characteristic(String s) { this.s = s; print("Creating Characteristic " + s); } protected void dispose() { print("disposing characteristic " + s); } } class Description{ private String s; Description(String s) { this.s = s; print("Creating Description " + s); } protected void dispose() { print("disposing description" + s); } } class LivingCreature{ private Characteristic p =
            new Characteristic("is alive"); private Description t =
            new Description("Basic living creature"); LivingCreature() { print("livingcreature"); } protected void dispose() { print("livingCreature dispose"); t.dispose(); p.dispose(); } } class Animal extends LivingCreature{ private Characteristic p = 
            new Characteristic("has heart"); private Description t = 
            new Description("animal not vegetalbe"); Animal(){print("Animal()");} protected void dispose() { print("Animal dispose"); t.dispose(); p.dispose(); super.dispose(); } } class Amphibian extends Animal { private Characteristic p =
            new Characteristic("can live in water"); private Description t =
            new Description("Both water an land"); Amphibian() { print("Amphibian()"); } protected void dispose() { print("Amphibian dispose"); t.dispose(); p.dispose(); super.dispose(); } } public class Frog extends Amphibian{ private Characteristic p = new Characteristic("Croaks"); private Description t = new Description("Eats bugs"); public Frog() { print("Forg()"); t.dispose(); p.dispose(); super.dispose(); } public static void main(String[] args) { Frog frog = new Frog(); print("bye!"); frog.dispose(); } }/* output: 消費的順序和初始化的順序相反 Creating Characteristic is alive Creating Description Basic living creature livingcreature Creating Characteristic has heart Creating Description animal not vegetalbe Animal() Creating Characteristic can live in water Creating Description Both water an land Amphibian() Creating Characteristic Croaks Creating Description Eats bugs Forg() disposing descriptionEats bugs disposing characteristic Croaks Amphibian dispose disposing descriptionBoth water an land disposing characteristic can live in water Animal dispose disposing descriptionanimal not vegetalbe disposing characteristic has heart livingCreature dispose disposing descriptionBasic living creature disposing characteristic is alive bye! Amphibian dispose disposing descriptionBoth water an land disposing characteristic can live in water Animal dispose disposing descriptionanimal not vegetalbe disposing characteristic has heart livingCreature dispose disposing descriptionBasic living creature disposing characteristic is alive *///~

 三,當一個成員對象存在於其它一個或多個對象共享的狀況時,也許就必須使用引用計數來跟蹤仍舊訪問着共享對象的對象數量了.繼承

//: polymorphism/ReferenceCounting.java // Cleaning up shared member objects
package object; import static net.mindview.util.Print.*; class Shared{ private int refcount =0; private static long counter  = 0; //記錄該類總共的對象個數
    private final long id = counter++; //final 表示不但願再對象生命週期內ID的值被改變
    public Shared() { print("Creating " + this); } public void addRef(){refcount++;} //記錄同一個對象被引用的次數
    public void dispose() { if(--refcount == 0) //當被引用數只有一個時執行清理 print("Disposing " + this); } public String toString(){return "Share " + id;} } class Composting{ private Shared shared; private static long counter = 0; private final long id = counter++; public Composting(Shared shared) { print("Creating " + this); this.shared= shared; this.shared .addRef(); } protected void dispose() { print("disposing " + this); shared.dispose(); } public String toString(){return "Composing " + id;} } public class ReferenceCounting{ public static void main(String[] args) { Shared shared = new Shared(); Composting[] composting = { new Composting(shared), new Composting(shared),new Composting(shared), new Composting(shared),new Composting(shared), }; for(Composting c : composting) c.dispose(); } }/* output: Creating Share 0 Creating Composing 0 Creating Composing 1 Creating Composing 2 Creating Composing 3 Creating Composing 4 disposing Composing 0 disposing Composing 1 disposing Composing 2 disposing Composing 3 disposing Composing 4 Disposing Share 0 *///:~
相關文章
相關標籤/搜索