當前位置:
首頁 > 最新 > Android面試題-Java對象生命周期

Android面試題-Java對象生命周期

Java對象在虛擬機上運行有7階段:創建、應用、不可見、不可達、收集、終結、對象空間重新分配。

(1)創建階段(Created)

創建Java對象階段的具體步驟如下:

為對象分配存儲空間;

構造對象;

從超類到子類對static成員進行初始化,類的static成員的初始化在ClassLoader載入該類時進行;

超類成員變數按順序初始化,遞歸調用超類的構造方法;

子類成員變數按順序初始化,一旦對象被創建,子類構造方法就調用該對象並為某些變數賦值,完成後這個對象的狀態就切換到了應用階段。

(2)應用階段(InUse)

對象至少被一個強引用持有。除非在系統中顯式地使用了軟引用、弱引用或虛引用。

(3)不可見階段(Invisible)

處於不可見階段的對象在虛擬機的對象引用根集合中再也找不到直接或間接的強引用,這些對象一般是所有線程棧中的臨時變數。所有已經裝載的靜態變數或是對本地代碼介面的引用。

當一個對象處於不可見階段時,說明程序本身不再持有該對象的任何強引用,雖然該對象仍然存在。該對象可能被虛擬機中的某些已裝載的靜態變數線程或JNI等強引用持有,這些特殊的強引用稱為「GC Root」。存在這些GC Root會導致對象的內存泄漏,無法被回收。

(4)不可達階段(Unreachable)

對象處於不可達階段是指該對象不再被任何強引用持有,回收器發現該對象已經不可達。

(5)收集階段(Collected)

當垃圾回收器發現該對象已經處於「不可達階段」並且垃圾回收器已經對該對象的內存空間重新分配做好準備時,對象進入「收集階段」。如果該對象已經重寫了finalize()方法,則執行該方法的操作。

(6)終結階段(Finalized)

當對象執行完finalize()方法後仍然處於不可達狀態時,該對象進入終結階段。在該階段,等待垃圾回收器回收該對象空間。

(7)對象空間重新分配階段(Deallocated)

若垃圾回收器對該對象佔用的內存空間進行回收或者再分配,則該對象徹底消失,這個階段稱為「對象空間重新分配階段」。

在Java語言中,可以作為GC Roots的對象包括下面幾種:

虛擬機棧(棧幀中的本地變數表)中引用的對象;

方法區中類靜態屬性引用的對象;

方法區中常量引用的對象;

本地方法棧中JNI(即一般說的Native方法)引用的對象;

總結就是,方法運行時,方法中引用的對象;類的靜態變數引用的對象;類中常量引用的對象;Native方法中引用的對象,所有正在運行的線程的棧上的引用變數、所有的全局變數、所有ClassLoader。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 公眾號 的精彩文章:

砭石減肥簡單痛苦少
第18期 美學看教育3-教師的「移情」
梵蒂岡天文台(三)
《中國有嘻哈》:小眾流行音樂節目橫空出世
廣州海珠區林阿姨的貓咪們在尋找鏟屎官

TAG:公眾號 |

您可能感興趣

Tomcat+Servlet面試題都在這裡
Hibernate面試題大全
Android面試題推薦
關於 ArrayList 的 5 道面試題
面試題殺手鐧:CopyOnWrite思想
搞定這套 Python 爬蟲面試題,面試會 so easy
在 GitHub 上收穫 6519顆Star 的 Python 面試題資源,到底有多牛?
python簡單面試題
Swift面試題(1)
前端面試題:JS中的let和var的區別
考一考!嵌入式Linux Shell腳本的面試題
2019前端框架面試題 —— Round one
百道Python面試題實現,搞定Python編程就靠它
自動化測試Selenium最新面試題和對應答案!
Python經典面試題21道
Python 經典面試題 21 道
Google 經典面試題解析
30道Spring面試題和答案
68道Spring面試題和答案
在GitHub上收穫6519顆星星的Python面試題資源,到底有多牛?