一、對象導論(三)

10、對象的創建和生命週期

這個話題貫穿Java內存模型與垃圾回收始終,是個很值得聊聊的地方,在這出現在導論裏只是簡單的概述一下,後面會有非常詳細的關於垃圾回收和內存模型的描述。

對象的創建

每個對象一旦被創建就必然會佔用JVM的內存資源,當程序不再需要它的時候,它也應該及時的被清理掉,以釋放資源供其他對象使用,在Java中,垃圾回收不是我們所關心的,我們只需要知道創建一個對象,然後使用,當它不再被使用之後,JVM會幫我們完成內存的回收。

Java中對象動態創建於內存池中,知道運行時才知道需要多少對象、及其生命週期和類型。如果需要一個新對象,可以在需要的時刻直接在堆中創建,因爲存儲空間是在運行時被動態管理的,所以需要大量的時間在堆中分配存儲空間,這可能要遠遠大於在棧中創建存儲空間的時間。在棧中存儲空間的創建和釋放通常個需要一條彙編指令即可,分別對應將棧頂指針向下移動和將棧頂指針向上移動。而堆中存儲空間的創建時間依賴於存儲機制的設計。

動態存儲有這樣一個一般性的邏輯假設:對象趨向於變得複雜,所有查找和釋放存儲空間的開銷不會對對象的創建造成重大沖擊。動態方式所帶來的更大的靈活性正是解決一般化變成的問題的要點所在。

Java中,要創建一個對象,就要使用new關鍵字來構建此對象的動態實例。

對象的生命週期

在棧上面創建的對象,其大小和生命週期都是確定的,隨着棧幀的彈出,其生命週期自然結束,空間也得以釋放。然而,如果是堆上創建的對象,其大小和生命週期都不是能被實時掌握的,只有在觸發垃圾回收的時候,JVM才能得知這個對象是否還能存活,如果還能存活,它還是不知道能活多久。這裏所提到的“垃圾回收(GC)”就是指JVM對“死去”的對象進行清理的活動,垃圾回收是很大一塊內容,無論是本書還是《Java虛擬機原理》都拿出了很大的篇幅進行介紹,其中後者講的比價有針對性,對GC感興趣的同學可以去讀一讀,必定獲益匪淺。

本章節剩下的內容也只是泛泛而談,後面會有比較詳細的講解,因此這一部分打算讀一下就好,不作筆記了,學到後面相關部分時再詳細記錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章