關於垃圾回收的一些基本原理及技術解析

傷心的我發表於2017-08-13

關於垃圾回收的一些基本原理及技術解析

什麼是垃圾,為什麼要垃圾回收?

  垃圾回收是很大一塊,在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

funnyzpc@gmail.com


相關文章