關于垃圾回收的一些基本原理及技術解析
什麼是垃圾,為什麼要垃圾回收?
垃圾回收是很大一塊,在java虛拟機一些資料描述中,jvm大緻幹三件大事兒,1>加載class 2>配置設定存儲空間 3>執行垃圾回收;可見垃圾回收在進階語言中所占的分量。(不好意思,扯遠了~),簡單點兒說就是:在程式運作時刻,産生的一直未能删除的或不能被引用的對象資料稱之為垃圾,如果一直未能通過有效的方式回收會導緻記憶體洩露(通俗點就是記憶體撐爆了).
關于人工回收的一些問題:
在C或C++語言中,程式員可顯示地安排資料回收,當然在理想的情況下 任何不會再被通路的的存儲都應該會被删除,同樣,任何可能還會被引用的存儲對象都不能被删除。但事實上,由于本身的回收困難之處以外還存在不少技術難點。簡單點兒說就是 A>如果一直未能删除不能被引用的記憶體資料會使0記憶體占用過大,導緻記憶體洩露 B>如果程式引用了一個已經被删除(回收的)的資料 會導緻空指針引用
垃圾回收的一般要求:
基本要求是類型安全,但不是所有語言都适合進行自動垃圾回收。為了使垃圾回收器正常工作,它必須知道給定的資料元素或元素的分量(是否或可用作)一個指向某塊已配置設定存儲空間的指針。但是資料元素或分量在一些進階語言中又是類型不安全的,比如在C或C++中可以對存儲位址進行任意操作。
垃圾回收的性能代價:
A>運作時間: 垃圾回收的速度可能較慢,容易增加一個應用程式的總運作時間
B>存儲空間使用 需要避免記憶體碎片,極大地利用可用記憶體空間
C>停頓時間 垃圾回收過程會在沒有任何預警的情況下突然啟動,導緻應用程式突然停頓,是以縮小停頓時間很重要
D>程式局部性 由于垃圾回收控制了資料的放置,是以影響了将要執行的代碼的資料局部性。此時需要通過釋放或複用空間改善時間局部性,通過重新放置移動一起使用的資料改善空間局部性
垃圾回收的一般方法:
垃圾回收分為:A>基于引用計數的垃圾回收 B>基于跟蹤的垃圾回收 C>短停頓式垃圾回收
引用式的垃圾回收:
概述:對應每個對象都維護一個對象的引用計數,當計數為0的時候,該對象會被确認為垃圾随即被删除。
缺點:它不能回收不可達的循環資料結構,因為每次引用指派都會增加一個額外運算,遂開銷比較大。
跟蹤的垃圾回收:
概述:标記所有可達對象并移入空閑清單,然後清掃整個堆區,此類型的垃圾回收會周期地(空閑空間耗盡或空閑空間低于某個閥值時)運作
缺點:很難找到堆區的不可達對象,導緻清掃的代價較大,清掃時程式會全面停頓
短停頓式垃圾回收:
概述:每次隻做部分垃圾回收工作,進而減少一次停頓的長度,按時間(增量式回收)或空間(部分式回收)分割回收任務
缺點:增量式垃圾回收在回收之後會留下漂浮垃圾,部分式垃圾回收會造成停頓較長或回收無效垃圾
原創部落格,轉載請注明出處:
http://cnblogs.com/funnyzpc