GC算法的评价标准
GC是什么
GC就是垃圾回收, 哎, 現(xiàn)在Java如日中天, JVM都又算了解吧. 其中的垃圾回收還經(jīng)常在面試中問(wèn)道(雖然我忘完了). 當(dāng)然, 垃圾回收不只是JVM, Python、等等高級(jí)語(yǔ)言都用到了. 簡(jiǎn)單說(shuō), GC完成的任務(wù)就兩件事:
之前用C語(yǔ)言的時(shí)候, 使用 malloc申請(qǐng)堆上的內(nèi)存, 是需要通過(guò)free函數(shù)進(jìn)行釋放的. 否則大量?jī)?nèi)存空間得不到釋放, 要出問(wèn)題的.
而GC簡(jiǎn)單說(shuō)就是幫你做了釋放內(nèi)存空間的操作, 使用這只需要?jiǎng)?chuàng)建, 而不需要關(guān)心釋放.
GC算法的評(píng)價(jià)標(biāo)準(zhǔn)
GC有很多的算法來(lái)實(shí)現(xiàn), 如何來(lái)評(píng)價(jià)一個(gè)GC算法的優(yōu)劣呢? 總要有個(gè)判斷的依據(jù)的吧.
1. 吞吐量
總聽(tīng)過(guò)過(guò)網(wǎng)絡(luò)吞吐量吧, 就是每秒能夠接受多少字節(jié)的數(shù)據(jù). 換到GC上也差不多的道理, 就是每秒能處理多少字節(jié)的內(nèi)存.
舉個(gè)例子:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-dbD1gcbR-1585471243814)(GC算法的評(píng)價(jià)標(biāo)準(zhǔn).assets/1585467465574.png)]
上面是一個(gè)程序的執(zhí)行流程, 其中GC執(zhí)行了兩次, 總時(shí)間為(A+B). 假設(shè)對(duì)內(nèi)存大小為S, 則平均吞吐量為: S/(A+B). 如果時(shí)間單位是秒, 堆大小為kb, 則吞吐量單位為 kb/s. 也就是平均每秒能處理的字節(jié)數(shù). 可以將吞吐量理解為速度.
顯而易見(jiàn), 吞吐量越大, 單位時(shí)間處理的內(nèi)存越多, GC執(zhí)行的時(shí)間就越短.
2. 最大暫停時(shí)間
因?yàn)槌绦蛟贑PU中是分片執(zhí)行的, 當(dāng)GC執(zhí)行的時(shí)候, 程序就需要暫停等待. 最大暫停時(shí)間值得就是: 執(zhí)行GC而暫停執(zhí)行程序的最長(zhǎng)時(shí)間.
最大暫停時(shí)間越小, 程序的中斷時(shí)間越短.
3.堆的使用效率
使用了某GC算法后, 留給程序使用的堆大小占多大比例. 比如標(biāo)記-復(fù)制算法, 講堆一分為二, 每次只使用其中的一半, 另一半空閑著, 使用效率就只有50%, 造成了很大的浪費(fèi), 有點(diǎn)空間換時(shí)間的意思. 使用效率當(dāng)然是越大越好.
4.訪問(wèn)的局部性
電腦中, CPU寄存器從高速緩存中獲取數(shù)據(jù), 高速緩存是內(nèi)存的部分?jǐn)?shù)據(jù), 內(nèi)存再?gòu)挠脖P獲取數(shù)據(jù). 越往后速度越慢, 相應(yīng)的空間越大, 讀取數(shù)據(jù)時(shí), 如果能夠從最近的又最快的地方讀取, 速度就會(huì)快很多.
應(yīng)用到GC中, 也是差不多的道理, 有些對(duì)象是需要經(jīng)常回收的, 而有些對(duì)象則會(huì)停留很長(zhǎng)一段時(shí)間, 每次回收時(shí)若能夠精準(zhǔn)定位到需要回收的對(duì)象, 則速度會(huì)提升很多.同時(shí), 將具有引用關(guān)系的相關(guān)對(duì)象放到內(nèi)存中的臨近位置, 訪問(wèn)時(shí)程序就無(wú)需多次讀取訪問(wèn)內(nèi)存.
JVM中的分代思想就有點(diǎn)這個(gè)意思.
也不能完全看這些標(biāo)準(zhǔn), 有的算法是這個(gè)高, 那個(gè)低. 還是要有所取舍的.
總結(jié)
- 上一篇: java 超构造函数_java中的超级构
- 下一篇: 关于相对性的思考