garbage Collection 垃圾回收java
1960 年,List語言使用了GC算法
java中,GC的對象是堆空間和永久區性能
老牌垃圾回收算法優化
經過引用計算來回收垃圾對象
引用計數器的實現很簡單,對於一個對象A,只要有任何一個對象引用了A,則A的引用計數器就加1,當引用失效時,引用計數器就減1。只要對象A的引用計數器的值爲0,則對象A就不可能再被使用。
內存
引用計數器的問題io
一、性能很差基礎
二、沒法處理循環引用List
標記-清除算法是現代垃圾回收算法的思想基礎。標記-清除算法將垃圾回收分爲兩個階段:標記階段和清除階段。一種可行的實現是,在標記階段,首先經過根節點,標記全部從根節點開始的可達對象。所以,未被標記的對象就是未被引用的垃圾對象。而後,在清除階段,清除全部未被標記的對象。
垃圾回收
使用於存活對象較多的場合,如老年代
它在標記-清除算法的基礎上作了一些優化。和標記-清除算法同樣,標記-壓縮算法也首先須要從根節點開始,對全部可達對象作一次標記。但以後,它並不簡單的清理未標記的對象,而是將全部的存活對象壓縮到內存的一端。以後,清理邊界外全部的空間。
與標記-清除算法相比,複製算法是一種相對高效的回收方法
不適用於存活對象較多的場合 如老年代
將原有的內存空間分爲兩塊,每次只使用其中一塊,在垃圾回收時,將正在使用的內存中的存活對象複製到未使用的內存塊中,以後,清除正在使用的內存塊中的全部對象,交換兩個內存的角色,完成垃圾回收
問題:
空間浪費
根據對象的存活週期進行分類,短命對象歸爲新生代,長命對象歸爲老年代
根據不一樣的代的特色,選擇適合的收集算法
短命對象,適合複製算法
長命對象,適合標記清理和標記壓縮
一、從根節點能夠觸及的對象
二、可復活的
不可觸及
一、不可觸及的對象不可能復活
二、能夠回收
三、finalize() 方法以後,可能會進入不可觸及狀態
一、棧中的引用對象
二、方法區中靜態成員和常量引用的對象
三、JIN方法棧中的引用對象
java的一種全局暫停的現象
全局停頓,全部java代碼中止,nativa代碼能夠執行,但不能和JVM交互
多半因爲GC引發
危害:長時間服務中止,沒有響應
遇到HA系統,可能引發主備切換,嚴重危害生產環境