GC算法的評價標準

GC是什麼

GC就是垃圾回收, 哎, 現在Java如日中天, JVM都有些了解吧. 其中的垃圾回收還經常在面試中問道(雖然我忘完了). 當然, 垃圾回收不只是JVM, Python等高級語言都用到了. 簡單說, GC完成的任務就兩件事:

  1. 找到內存中已經無用的垃圾
  2. 將垃圾回收, 以便於之後可以再次利用

之前用C語言的時候, 使用 malloc申請堆上的內存, 是需要通過free函數進行釋放的. 否則大量內存空間得不到釋放, 要出問題的.

而GC簡單說就是幫你做了釋放內存空間的操作, 使用的人只需要創建, 而不需要關心釋放.

GC算法的評價標準

GC有很多的算法來實現, 如何來評價一個GC算法的優劣呢? 總要有個判斷的依據的吧.

1. 吞吐量

總聽過過網絡吞吐量吧, 就是每秒能夠接受多少位元組的數據. 換到GC上也差不多的道理, 就是每秒能處理多少位元組的內存.

舉個例子:

上面是一個程序的執行流程, 其中GC執行了兩次, 總時間為(A+B). 假設對內存大小為S, 則平均吞吐量為: S/(A+B). 如果時間單位是秒, 堆大小為kb, 則吞吐量單位為 kb/s. 也就是平均每秒能處理的位元組數. 可以將吞吐量理解為速度.

顯而易見, 吞吐量越大, 單位時間處理的內存越多, GC執行的時間就越短.

2. 最大暫停時間

因為程序在CPU中是分片執行的, 當GC執行的時候, 程序就需要暫停等待. 最大暫停時間值得就是: 執行GC而暫停執行程序的最長時間.

最大暫停時間越小, 程序的中斷時間越短.

3.堆的使用效率

使用了某GC算法後, 留給程序使用的堆大小佔多大比例. 比如標記-複製算法, 講堆一分為二, 每次只使用其中的一半, 另一半空閑着, 使用效率就只有50%, 造成了很大的浪費, 有點空間換時間的意思. 使用效率當然是越大越好.

4.訪問的局部性

電腦中, CPU寄存器從高速緩存中獲取數據, 高速緩存是內存的部分數據, 內存再從硬盤獲取數據. 越往後速度越慢, 相應的空間越大, 讀取數據時, 如果能夠從最近的又最快的地方讀取, 速度就會快很多.

應用到GC中, 也是差不多的道理, 有些對象是需要經常回收的, 而有些對象則會停留很長一段時間, 每次回收時若能夠精準定位到需要回收的對象, 則速度會提升很多.同時, 將具有引用關係的相關對象放到內存中的臨近位置, 訪問時程序就無需多次讀取訪問內存.

JVM中的分代思想就有點這個意思.


也不能完全看這些標準, 有的算法是這個高, 那個低. 還是要有所取捨的.