1.11 对象的销毁
對(duì)象使用完之后需要對(duì)其進(jìn)行清除。對(duì)象的清除是指釋放對(duì)象占用的內(nèi)存。在創(chuàng)建對(duì)象時(shí),用戶必須使用 new 操作符為對(duì)象分配內(nèi)存。不過,在清除對(duì)象時(shí),由系統(tǒng)自動(dòng)進(jìn)行內(nèi)存回收,不需要用戶額外處理。這也是 Java 語言的一大特色,某種程度上方便了程序員對(duì)內(nèi)存的管理。
Java 語言的內(nèi)存自動(dòng)回收稱為垃圾回收(Garbage Collection)機(jī)制,簡(jiǎn)稱 GC。垃圾回收機(jī)制是指 JVM 用于釋放那些不再使用的對(duì)象所占用的內(nèi)存。
Java 語言并不要求 JVM 有 GC,也沒有規(guī)定 GC 如何工作。不過常用的 JVM 都有 GC,而且大多數(shù) GC 都使用類似的算法管理內(nèi)存和執(zhí)行回收操作。具體的垃圾回收實(shí)現(xiàn)策略有好多種,在此不再贅述。
一個(gè)對(duì)象被當(dāng)作垃圾回收的情況主要如下兩種。
1)對(duì)象的引用超過其作用范圍。
{Object o = new Object(); // 對(duì)象o的作用范圍,超過這個(gè)范圍對(duì)象將被視為垃圾 }2)對(duì)象被賦值為 null。
{Object o = new Object();o = null; // 對(duì)象被賦值為null將被視為垃圾 }在 Java 的 Object 類中還提供了一個(gè) protected 類型的 finalize() 方法,因此任何 Java 類都可以覆蓋這個(gè)方法,在這個(gè)方法中進(jìn)行釋放對(duì)象所占有的相關(guān)資源的操作。
在 Java 虛擬機(jī)的堆區(qū),每個(gè)對(duì)象都可能處于以下三種狀態(tài)之一。
-
可觸及狀態(tài):當(dāng)一個(gè)對(duì)象被創(chuàng)建后,只要程序中還有引用變量引用它,那么它就始終處于可觸及狀態(tài)。
-
可復(fù)活狀態(tài):當(dāng)程序不再有任何引用變量引用該對(duì)象時(shí),該對(duì)象就進(jìn)入可復(fù)活狀態(tài)。在這個(gè)狀態(tài)下,垃圾回收器會(huì)準(zhǔn)備釋放它所占用的內(nèi)存,在釋放之前,會(huì)調(diào)用它及其他處于可復(fù)活狀態(tài)的對(duì)象的finalize() 方法,這些 finalize() 方法有可能使該對(duì)象重新轉(zhuǎn)到可觸及狀態(tài)。
-
不可觸及狀態(tài):當(dāng) Java 虛擬機(jī)執(zhí)行完所有可復(fù)活對(duì)象的 finalize()
方法后,如果這些方法都沒有使該對(duì)象轉(zhuǎn)到可觸及狀態(tài),垃圾回收器才會(huì)真正回收它占用的內(nèi)存。
注意:調(diào)用 System.gc() 或者 Runtime.gc() 方法也不能保證回收操作一定執(zhí)行,它只是提高了 Java 垃圾回收器盡快回收垃圾的可能性。
總結(jié)
以上是生活随笔為你收集整理的1.11 对象的销毁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.10 访问对象的属性和行为
- 下一篇: 1.13 实例:用户修改密码