1. 程式人生 > >JVM垃圾回收機制

JVM垃圾回收機制

root 不一定 引用 不可達 tenured jvm 空間 大量 jvm垃圾回收

在java中是通過引用來和對象進行關聯的,也就是說如果要操作對象,必須通過引用來進行。那麽很顯然一個簡單的辦法就是通過引用計數來判斷一個對象是否可以被回收。不失一般性,如果一個對象沒有任何引用與之關聯,則說明該對象基本不太可能在其他地方被使用到,那麽這個對象就成為可被回收的對象了。這種方式成為引用計數法。 這種方式的特點是實現簡單,而且效率較高,但是它無法解決循環引用的問題,因此在Java中並沒有采用這種方式(Python采用的是引用計數法)。 為了解決這個問題,在Java中采取了 可達性分析法 該方法的基本思想是通過一系列的“GC Roots”對象作為起點進行搜索,如果在“GC Roots”
和一個對象之間沒有可達路徑,則稱該對象是不可達的,不過要註意的是被判定為不可達的對象不一定就會成為可回收對象。被判定為不可達的對象要成為可回收對象必須至少經歷兩次標記過程,如果在這兩次標記過程中仍然沒有逃脫成為可回收對象的可能性,則基本上就真的成為可回收對象了。

垃圾回收算法:

1,mark-sweep標記清楚算法,最容易實現,但是有可能導致過多的內存碎片;

2,copying算法,實現簡單,運行高效,對內存空間對使用造成浪費

3,Mark-compact 標記整理,不是直接清理可回收對象,而是將存活對象都向一端移動,然後清理邊界以外的內存;

4,Generational Collection 算法,是目前大多數JVM垃圾收集器,采用的算法,核心是根據對象存活的周期長度分為若幹個不同的區域,將堆區分為Tenured Generation和Young Generation,T的特點是只有少量對象才會被gc大部分用Mark-compact,Y大量,大部分用Copying;

5,在堆區之外還有一個代就是永久代(Permanet Generation),它用來存儲class類、常量、方法描述等。對永久代的回收主要回收兩部分內容:廢棄常量和無用的類。

JVM垃圾回收機制