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面試題資源,到底有多牛?