Java垃圾收集器算法

	**引用計數算法**:在對象中添加一個引用計數器,每當有一個地方引用他時,計數器值就加一,當引用失效是=時,計數器值就減一,爲零時的對象就是不可能再被使用。優點:雖然佔用了一些額外的內存空間用來計數,但是原理簡單,判定效率也很高。缺點:有很多例外情況要考慮,必須配合大量額外處理才能保證正確地工作。碧如單純的引用計數就很難解決對象之間相互循環使用的問題。
	**可達性分析算法**:通過一系列稱爲“GC Roots” 的根對象作爲起始節點集,從這些節點根據引用關係向下搜索,搜索過程所走過的路徑稱爲“引用鏈”。如果某對象到GC Roots間沒有任何引用鏈相連,就是從GC Roots 到這個對象不可達,則證明這個對象是不可能再被使用,判定爲可回收對象。
	GC Roots 對象包括以下幾種:
		1.在虛擬機棧中引用的對象,譬如各個線程被調用的方法堆棧中使用到的參數、局部變量、臨時變量等。
		2.在方法區中類靜態屬性引用的對象,譬如Java類的引用類型靜態變量。
		3.在方法區中常量引用的對象,譬如字符串常量池裏的引用
		4.在本地方法棧中JNI即Native方法引用的對象
		5.Java虛擬機內部的引用,如基本數據類型對應的Class對象,一些常駐的異常對象還有系統類加載器。
		6.所有同步鎖持有的對象。
		7.反映Java虛擬機內部情況的JNXBean、JVMTI中註冊的回調、本地代碼緩存等
	**引用**分爲強引用,軟引用,弱引用,虛引用,強度依次減弱
		強引用是指程序代碼中普遍存在的引用賦值,無論任何情況下只要強引用存在,被引用的對象就不可能被垃圾處理器回收
		軟引用是用來描述一些還有用但是非必須的對象。只被軟引用關聯着的對象,在系統將要發生內存溢出前,會把這些對象列進回收範圍進行二次回收,如果這次回收還沒有足夠內存才拋出內存溢出異常
		弱引用也是用來描述那些非必須的對象,被關聯的對象只能生存到下一次垃圾收集發生爲止,無論內存是否足夠
		虛引用也被稱爲幽靈引用或者幻影引用,一個對象是否有虛引用的存在完全不對其生存時間構成影響,爲一個對象設置虛引用關聯的唯一目的只是爲了能在這個對象唄回收時收到一個系統通知。
		**分代收集理論**:1.弱分代假說:絕大多數對象都是朝生夕滅的;2,強分代假說: 熬過越多次垃圾收集過程的對象越難以消亡。這兩個分代假說共同奠定了多款常用的垃圾收集器的一致的設計原則:收集器應該將Java堆劃分爲不同的區域,然後將回收對象依據其年齡分配到不同的區域之中存儲。3.跨代引用假說:跨代引用相對於同代引用來說只佔極少數。
		**安全點**:安全點是在程序執行期間的所有GC Root已知並且所有堆對象的內容一致的點。

從全局的角度來看,所有線程必須在GC運行之前在安全點阻塞。 (作爲一種特殊情況,運行JNI代碼的線程可以繼續運行,因爲它們只使用句柄。但在安全點期間,它們必須阻塞而不是加載句柄的內容。)
從本地的角度來看,安全點是一個顯着的點,它位於執行線程可能阻止GC的代碼塊中。 大多數調用點都能當做安全點。
在每個安全點都存在強大的不變量永遠保持true不變,而在非安全點可能會被忽視。 編譯的Java代碼和C / C ++代碼都在安全點之間進行了優化,但跨安全點時卻不那麼優化。 JIT編譯器在每個安全點發出GC映射。 VM中的C / C ++代碼使用程式化的基於宏的約定(例如,TRAPS)來標記潛在的安全點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章