GC(Garbage Collection)垃圾收集,即將內存分爲幾個區域,將不同的生命週期的對象放在不同區域裏,在GC收集的時候,頻繁收集生命週期短的區域(young).比較少的收集生命週期較長的區域(old),基本不收集的永久區(perm).1960年List使用了GC,java中,GC的對象是堆空間和永久區,GC的作用是自動檢測對象是否超過作用域從而自動回收內存.防止人爲的引入導致內存的泄露.
GC算法:
---標記清除法
---標記壓縮法
---複製算法
---引用計數法
1.標記---清除
標記---清除算法是現代垃圾回收算法的思想基礎.標記---清除算法將垃圾回收分爲兩個階段:標記階段和清除階段.一種可行的實現是,在標記階段,首先通過根節點,標記所有從根節點開始的可達對象.因此,未被標記的對象就是未被引用的垃圾對象.然後,在清除階段,清除所有爲被標記的對象.
優點:
解決了循環引用的問題
缺點:
(1)暫停整個應用
(2)會產生內存碎片
(3)不管這個對象是否可達,是否爲垃圾,都要在清除階段被檢查一遍,非常耗時.
2.標記---壓縮
標記---壓縮算法適合用於存活對象比較多的場合,如老年代.它在標記---清除算法的基礎上做了一些優化.和標記---清除算法一樣,標記---壓縮算法也首先需要從根節點開始,對所有可達對象做一次標記.但之後它並不簡單的清理未標記的對象,而是將所有的存活對象壓縮到內存的一端.之後,清理邊界外所有的空間.
優點:
(1)避免標記掃描的碎片問題
(2)避免停止複製的空間問題
缺點:
同標記---清除法.
3.複製算法
與標記---清除算法相比,複製算法是一種相對高效的回收方法.不適用於存活對象較多的場合 如老年代.
複製算法是將原有的內存空間分爲兩塊,每次只使用其中一塊,在垃圾回收時,將正在使用的內存中的存活對象複製到未使用的內存塊中,之後,清除正在使用的內存塊中的所有對象,交換兩個內存的角色,完成垃圾回收.
優點:
不會出現碎片問題
缺點:
(1)暫停整個應用
(2)需要2倍的內存空間
4.引用計數法
引用計數法的實現很簡單,對於一個對象A,只要有任何一個對象引用了A,則A的引用計數器就加1,當引用失效時,引用計數器就減1.只要對象A的引用計數器的值爲0,則對象A就不可能再被使用.
缺點:
引用和去引用伴隨加法和減法,影響性能.
很難處理循環引用.
分代思想:
依據對象的存活週期進行分類,短命對象歸爲新生代,長命對象歸爲老年代.
young:主要用來存放新生的對象
old:主要存放應用程序中生命週期長的內存對象.
permanent:內存的永久保存區域,主要存放class和meta的信息.class在被load的時候被放到永久保存區域,他和存放instance的堆區域不同,GC不會在主程序運行期對永久保存區域進行清理.所以如果你的APP會load很多class的話,就會出現PermGen space錯誤.在java8中,已經沒有了這個permanent代,只有在HotspotVM中有.
根據不同代的特點,選取合適的收集算法
少量對象存活,適合複製算法
大量對象存活,適合標記清理或者標記壓縮