若是不進行垃圾回收,內存早晚都會被消耗空。所以咱們在不斷的分配內存空間而且同時進行着垃圾回收操做。算法
哪些內存須要回收是垃圾回收機制第一個要考慮的問題,所謂「要回收的垃圾」就是不被任何途徑使用的對象。那麼如何找到這些對象?spa
這個算法的實現是,給對象中添加一個引用計數器,每當一個地方引用這個對象時,計數器值+1;當引用失效時,計數器值-1。(任什麼時候刻計數值爲0的對象就是不可能再被使用的。這種算法使用場景不少,可是,Java中卻沒有使用這種算法,由於這種算法很難解決對象之間相互引用的狀況。)對象
兩個對象相互引用着,可是虛擬機仍是把這兩個對象回收掉了,這也說明虛擬機並非經過引用計數法來斷定對象是否存活的。
這個算法的基本思想是經過一系列稱爲「GC Roots」的對象做爲起始點,從這些節點向下搜索,搜索所走過的路徑稱爲引用鏈,當一個對象到GC Roots沒有任何引用鏈(即GC Roots到對象不可達)時,則證實此對象是不可用的。blog
方法區的垃圾回收主要回收兩部份內容:1. 廢棄常量。2. 無用的類。既然進行垃圾回收,就須要判斷哪些是廢棄常量,哪些是無用的類。內存
標記-清除算法就如同它的名字樣,分爲「標記」和「清除」兩個階段:首先標記出全部須要回收的對象,標記完成後統一回收全部被標記的對象。虛擬機
標記和清除兩個過程的效率都不高;不連續的內存碎片,分配較大對象時,沒法找到足夠的連續內存效率
它將可用的內存分爲兩塊,每次只用其中一塊,當這一塊內存用完了,就將還存活着的對象複製到另一塊上面,而後再把已經使用過的內存空間一次性清理掉。垃圾回收
內存縮小爲了原來的一半,這樣代價過高了搜索
而是讓全部存活對象都向一端移動,而後直接清理掉邊界之外的內存引用
(新生代),使用複製算法,複製成本低;
(老年代),採用標記-清理算法或者標記-整理算法。