深入理解java虚拟机gc_java底层:GC相关——深入理解java虚拟机
Java垃圾回收之回收算法
光有垃圾標記算法還不行,JVM還需要有垃圾回收算法來將這些標記為垃圾的對象給釋放回收掉。主要的回收算法有以下幾種:
1.標記 - 清除算法(Mark and Sweep):標記:從根集合進行掃描,對存活的對象進行標記
清除:對堆內(nèi)存從頭到尾進行線性遍歷,回收不可達對象內(nèi)存
缺點
效率問題:標記 和 清除這兩個過程效率都不高。空間問題:標記和清除后會產(chǎn)生大量 不連續(xù)的 內(nèi)存碎片,空間碎片太多 可能會導致 以后在程序運行中 需要分配較大對象時,無法找到足夠連續(xù)內(nèi)存而不得不觸發(fā)一次垃圾回收,觸發(fā)一次之后要是內(nèi)存還不夠,就會連續(xù)觸發(fā),導致OOM
2.復制算法(Copying):將可用的內(nèi)存容量按一定比例劃分為兩塊或多塊,并將其中一塊或兩塊作為對象面,剩余的則作為空閑面
對象在對象面上創(chuàng)建,當對象面的內(nèi)存空間用完時,會將存活的對象從對象面復制到空閑面中,接著清除該對象面中所有的對象
優(yōu)點:解決內(nèi)存碎片化問題,順序分配內(nèi)存,簡單高效。該算法適用于對象存活率低的場景,所以普遍應用在新生代中,因為新生代里的對象存活率通常情況下只有10%左右
3.標記 - 整理算法(Compacting):標記:從根集合進行掃描,對存活的對象進行標記
整理:移動所有存活的對象,且按照內(nèi)存地址次序依次排列,然后將末端內(nèi)存地址以后的內(nèi)存全部回收
優(yōu)點:避免了標記 - 清除算法所帶來的內(nèi)存不連續(xù)性問題,以及不需要像復制算法那樣需要設置兩塊內(nèi)存互換。該算法適用于對象存活率較高的場景,所以普遍應用在老年代中,因為老年代里對象存活率較高
4.分代收集算法(Generational Collector):實際是多種垃圾回收算法的組合拳,該算法對堆內(nèi)存進行進一步的劃分,按照對象生命周期的不同劃分區(qū)域以采用不同的垃圾回收算法。目的是提高JVM的回收效率,也是目前JVM使用的回收算法
一般是把Java堆分為新生代和老年代。在新生代中,每次垃圾回收都有大批的對象死去,只有少量存活,因此我們采用復制算法;而老年代中對象的存活率高,沒有額外空間對他進行分配擔保,就必須采用"標記-清理"或者"標記-整理"算法。
5.Minor GC、Major GC、Full GC的區(qū)別?
堆內(nèi)存劃分為Eden、Survivor、和Tenured/Old空間Minor GC 又稱為新生代GC 指的是發(fā)生在新生代的垃圾回收操作(包括Eden區(qū)和Survivor區(qū))。當JVM無法為一個新的對象分配空間時候,會觸發(fā)Minor GC。因為新生代中大多數(shù)對象的生命周期都很短,因此Minor GC(采用復制算法)非常頻繁,雖然它會觸發(fā)stop-the-world,但是回收速度也比較快。
Major GC清理老年代,出現(xiàn)Major GC通常會出現(xiàn)至少一次Minor GC即大多數(shù)Major GC是由Minor GC觸發(fā)的
Full GC是針對整個堆空間包括新生代、老年代、元空間GC,Full GC不等于Major GC,也不等于Minor GC+Major GC。
總結
以上是生活随笔為你收集整理的深入理解java虚拟机gc_java底层:GC相关——深入理解java虚拟机的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里二面差点败在这道题:MySQL自增主
- 下一篇: 已饱和!未来程序员没活路了...