一、問題
筆者最近遇到超級(jí)多的關(guān)于java中垃圾回收機(jī)制的問題,所以特地寫一遍博客來和大家交流一下java中的垃圾回收到底是什么鬼。所謂垃圾回收即使jvm覺得你這個(gè)對(duì)象沒有存在的必要,將你清理出去,那么問題來了。
如何確定某個(gè)對(duì)象是需要被回收?
典型的垃圾收集算法,是怎么回收對(duì)象的?
典型的垃圾收集器有哪些?
下面我來一個(gè)一個(gè)看問題
二、如何確定某個(gè)對(duì)象是需要被回收的
這里我們先了解一個(gè)的問題:如果確定某個(gè)對(duì)象是“垃圾”?既然垃圾收集器的任務(wù)是回收垃圾對(duì)象所占的空間供新的對(duì)象使用,那么垃圾收集器如何確定某個(gè)對(duì)象是“垃圾”?—即通過什么方法判斷一個(gè)對(duì)象可以被回收了。有些對(duì)象是jvm內(nèi)存不足需要清理內(nèi)存空間,會(huì)將下一輪需要回收的對(duì)象進(jìn)行清理。
在java中是通過引用來和對(duì)象進(jìn)行關(guān)聯(lián)的,也就是說如果要操作對(duì)象,必須通過引用來進(jìn)行。那么很顯然一個(gè)簡單的辦法就是通過引用計(jì)數(shù)來判斷一個(gè)對(duì)象是否可以被回收。不失一般性,如果一個(gè)對(duì)象沒有任何引用與之關(guān)聯(lián),則說明該對(duì)象基本不太可能在其他地方被使用到,那么這個(gè)對(duì)象就成為可被回收的對(duì)象了。這種方式成為引用計(jì)數(shù)法。
這樣的方法簡單粗暴,而且效率很高。效率高必然會(huì)暴露一些問題,如果某些對(duì)象唄循環(huán)引用,即使你把對(duì)象賦值為null,這種算法照樣不能回收??聪孪旅娴拇a
public class GcTest { public Object object = null; public static void main(String[] args) { GcTest gcTest1 = new GcTest(); GcTest gcTest2 = new GcTest(); gcTest1.object = gcTest1; gcTest2.object = gcTest2; gcTest1 = null; gcTest2 = null; } }
延伸閱讀
學(xué)習(xí)是年輕人改變自己的最好方式