結合jvm - 內存空間、jvm - 堆內存分配,合併後圖以下:
當咱們調用一個方法的時候,就會建立這個方法的棧幀,當方法調用結束的時候,這個棧幀出棧,棧幀所佔用的內存也隨之釋放。若是這個線程銷燬了,那與這個線程相關的棧以及程序計數器的內存也隨之被回收,那在堆內存中建立的對象怎麼辦?這些對象但是都佔着不少的內存資源的。所以咱們須要知道哪些對象是能夠回收的,哪些對象是不能回收的。算法
可達性分析算法
可達性算法就是從GC Roots出發,去搜索他引用的對象,而後根據這個引用的對象,繼續查找他引用的對象。若是一個對象到GC Roots沒有任何引用鏈相連,說明他是不可用的,這個類就能夠回收,好比下圖的object五、object六、object7。
咱們回憶一下合併圖:jvm
- 類加載到方法區的時候,初始化階段會爲靜態變量賦值,他所引用的對象能夠作GC Roots。
- 一樣的,方法區的常量引用的對象能夠作GC Roots。
- 調用方法的時候,會建立方法的棧幀,棧幀裏的局部變量引用的對象,能夠作GC Roots。
- 一樣的,本地方法棧中棧幀裏的局部變量引用的對象,能夠作GC Roots。
可達性算法除了GC Roots,還有一個引用,引用分如下幾種:spa
- 強引用(Strong Reference):只要強引用還存在,垃圾收集器永遠不會回收被引用的對象。
- 軟引用(Soft Reference):在系統將要發生內存溢出異常以前,將會把這些對象列進回收範圍之中進行第二次回收。若是此次回收尚未足夠的內存,纔會拋出內存溢出異常。
- 弱引用(Weak Reference ): 被弱引用關聯的對象只能生存到下一次垃圾收集發生以前。當垃圾收集器工做時,不管當前內存是否足夠, 都會回收掉只被弱引用關聯的對象。
- 虛引用(Phantom Reference):一個對象是否有虛引用的存在,徹底不會對其生存時間構成影響,也沒法經過虛引用來取得一個對象實例。爲一個對象設置虛引用關聯的惟一目的就是能在這個對象被收集器回收時收到一個系統通知。