Java垃圾回收之復(fù)制算法詳解
之前的Java垃圾回收之標(biāo)記清除算法詳解 會(huì)導(dǎo)致內(nèi)存碎片。下文的介紹的coping算法可以解決內(nèi)存碎片問(wèn)題。
概述
如果jvm使用了coping算法,一開(kāi)始就會(huì)將可用內(nèi)存分為兩塊,from域和to域, 每次只是使用from域,to域則空閑著。當(dāng)from域內(nèi)存不夠了,開(kāi)始執(zhí)行GC操作,這個(gè)時(shí)候,會(huì)把from域存活的對(duì)象拷貝到to域,然后直接把from域進(jìn)行內(nèi)存清理。
應(yīng)用場(chǎng)景
coping算法一般是使用在新生代中,因?yàn)樾律械膶?duì)象一般都是朝生夕死的,存活對(duì)象的數(shù)量并不多,這樣使用coping算法進(jìn)行拷貝時(shí)效率比較高。
jvm將Heap 內(nèi)存劃分為新生代與老年代,又將新生代劃分為Eden(伊甸園) 與2塊Survivor Space(幸存者區(qū)) ,然后在Eden –>Survivor Space 以及From Survivor Space 與To Survivor Space 之間實(shí)行Copying 算法。
不過(guò)jvm在應(yīng)用coping算法時(shí),并不是把內(nèi)存按照1:1來(lái)劃分的,這樣太浪費(fèi)內(nèi)存空間了。一般的jvm都是8:1。也即是說(shuō),Eden區(qū):From區(qū):To區(qū)域的比例是8:1:1
始終有90%的空間是可以用來(lái)創(chuàng)建對(duì)象的,而剩下的10%用來(lái)存放回收后存活的對(duì)象。

1、當(dāng)Eden區(qū)滿的時(shí)候,會(huì)觸發(fā)第一次young gc,把還活著的對(duì)象拷貝到Survivor From區(qū);當(dāng)Eden區(qū)再次觸發(fā)young gc的時(shí)候,會(huì)掃描Eden區(qū)和From區(qū)域,對(duì)兩個(gè)區(qū)域進(jìn)行垃圾回收,經(jīng)過(guò)這次回收后還存活的對(duì)象,則直接復(fù)制到To區(qū)域,并將Eden和From區(qū)域清空。
2、當(dāng)后續(xù)Eden又發(fā)生young gc的時(shí)候,會(huì)對(duì)Eden和To區(qū)域進(jìn)行垃圾回收,存活的對(duì)象復(fù)制到From區(qū)域,并將Eden和To區(qū)域清空。
3、可見(jiàn)部分對(duì)象會(huì)在From和To區(qū)域中復(fù)制來(lái)復(fù)制去,如此交換15次(由JVM參數(shù)MaxTenuringThreshold決定,這個(gè)參數(shù)默認(rèn)是15),最終如果還是存活,就存入到老年代
注意:
- 萬(wàn)一存活對(duì)象數(shù)量比較多,那么To域的內(nèi)存可能不夠存放,這個(gè)時(shí)候會(huì)借助老年代的空間。
優(yōu)點(diǎn)
在存活對(duì)象不多的情況下,性能高,能解決內(nèi)存碎片和Java垃圾回收之標(biāo)記清除算法詳解 中導(dǎo)致的引用更新問(wèn)題。
缺點(diǎn)
- 會(huì)造成一部分的內(nèi)存浪費(fèi)。不過(guò)可以根據(jù)實(shí)際情況,將內(nèi)存塊大小比例適當(dāng)調(diào)整;
- 如果存活對(duì)象的數(shù)量比較大,coping的性能會(huì)變得很差。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
詳解Java TCC分布式事務(wù)實(shí)現(xiàn)原理
這篇文章主要介紹了詳解Java TCC分布式事務(wù)實(shí)現(xiàn)原理,對(duì)分布式事務(wù)感興趣的同學(xué),一定要看一下2021-04-04
用SpringMVC編寫一個(gè)HelloWorld的詳細(xì)過(guò)程
SpringMVC是Spring的一個(gè)后續(xù)產(chǎn)品,是Spring的一個(gè)子項(xiàng)目<BR>SpringMVC?是?Spring?為表述層開(kāi)發(fā)提供的一整套完備的解決方案,本文我們將用SpringMVC編寫一個(gè)HelloWorld,文中有詳細(xì)的編寫過(guò)程,需要的朋友可以參考下2023-08-08
spring boot 配置freemarker及如何使用freemarker渲染頁(yè)面
springboot中自帶的頁(yè)面渲染工具為thymeleaf 還有freemarker這兩種模板引擎,本文重點(diǎn)給大家介紹spring boot 配置freemarker及如何使用freemarker渲染頁(yè)面,感興趣的朋友一起看看吧2023-10-10
SpringBoot集成DJL實(shí)現(xiàn)圖片分類功能
DJL是一個(gè)使用Java?API簡(jiǎn)化模型訓(xùn)練、測(cè)試、部署和使用深度學(xué)習(xí)模型進(jìn)行推理的開(kāi)源庫(kù)深度學(xué)習(xí)工具包,開(kāi)源的許可協(xié)議是Apache-2.0,本文給大家介紹了SpringBoot集成DJL實(shí)現(xiàn)圖片分類功能,需要的朋友可以參考下2024-10-10
Java算法之BFS,DFS,動(dòng)態(tài)規(guī)劃和貪心算法的實(shí)現(xiàn)
廣度優(yōu)先搜索(BFS)和深度優(yōu)先搜索(DFS)是圖遍歷算法中最常見(jiàn)的兩種算法,主要用于解決搜索和遍歷問(wèn)題。動(dòng)態(tài)規(guī)劃和貪心算法則用來(lái)解決優(yōu)化問(wèn)題。本文就來(lái)看看這些算法的具體實(shí)現(xiàn)吧2023-04-04
解決spring項(xiàng)目找不到Aspect依賴注解的問(wèn)題
這篇文章主要介紹了解決spring項(xiàng)目找不到Aspect依賴注解的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
logback的使用和logback.xml詳解(小結(jié))
Logback是由log4j創(chuàng)始人設(shè)計(jì)的另一個(gè)開(kāi)源日志組件,這篇文章主要介紹了logback的使用和logback.xml詳解(小結(jié)),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-11-11

