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