日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

GC算法基础

發(fā)布時(shí)間:2024/2/28 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GC算法基础 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自?http://www.wolfbe.com/detail/201609/364.html#

轉(zhuǎn)載自?http://www.wolfbe.com/detail/201609/364.html#

Java中的垃圾回收?

摘要:總的來(lái)說(shuō)基本所有的回收器都會(huì)關(guān)注如下兩個(gè)方面:找出所有的存活對(duì)象;清理掉所有的其它對(duì)象——也就是那些被認(rèn)為是廢棄或無(wú)用的對(duì)象。

原文出處:英文原文鏈接

在深入GC算法的實(shí)現(xiàn)細(xì)節(jié)之前,我們最好先來(lái)了解下相關(guān)術(shù)語(yǔ)及背后的基本原理。不同回收器的實(shí)現(xiàn)細(xì)節(jié)各有不同,但總的來(lái)說(shuō)基本所有的回收器都會(huì)關(guān)注如下兩個(gè)方面:

  • 找出所有的存活對(duì)象
  • 清理掉所有的其它對(duì)象——也就是那些被認(rèn)為是廢棄或無(wú)用的對(duì)象。

首先,所有回收器都會(huì)通過(guò)一個(gè)標(biāo)記過(guò)程來(lái)對(duì)存活對(duì)象進(jìn)行統(tǒng)計(jì)。

?

標(biāo)記可達(dá)對(duì)象

JVM中用到的所有現(xiàn)代GC算法在回收前都會(huì)先找出所有仍存活的對(duì)象。下圖中所展示的JVM中的內(nèi)存布局可以用來(lái)很好地闡釋這一概念:

首先,垃圾回收器將某些特殊的對(duì)象定義為GC根對(duì)象。所謂的GC根對(duì)象包括:

  • 當(dāng)前執(zhí)行方法中的所有本地變量及入?yún)?/li>
  • 活躍線程
  • 已加載類中的靜態(tài)變量
  • JNI引用

接下來(lái),垃圾回收器會(huì)對(duì)內(nèi)存中的整個(gè)對(duì)象圖進(jìn)行遍歷,它先從GC根對(duì)象開(kāi)始,然后是根對(duì)象引用的其它對(duì)象,比如實(shí)例變量。回收器將訪問(wèn)到的所有對(duì)象都標(biāo)記為存活。

存活對(duì)象在上圖中被標(biāo)記為藍(lán)色。當(dāng)標(biāo)記階段完成了之后,所有的存活對(duì)象都已經(jīng)被標(biāo)記完了。其它的那些(上圖中灰色的那些)也就是GC根對(duì)象不可達(dá)的對(duì)象,也就是說(shuō)你的應(yīng)用不會(huì)再用到它們了。這些就是垃圾對(duì)象,回收器將會(huì)在接下來(lái)的階段中清除它們。

關(guān)于標(biāo)記階段有幾個(gè)關(guān)鍵點(diǎn)是值得注意的:

  • 開(kāi)始進(jìn)行標(biāo)記前,需要先暫停應(yīng)用線程,否則如果對(duì)象圖一直在變化的話是無(wú)法真正去遍歷它的。暫停應(yīng)用線程以便JVM可以盡情地收拾家務(wù)的這種情況又被稱之為安全點(diǎn)(Safe Point),這會(huì)觸發(fā)一次Stop The World(STW)暫停。觸發(fā)安全點(diǎn)的原因有許多,但最常見(jiàn)的應(yīng)該就是垃圾回收了。
  • 暫停時(shí)間的長(zhǎng)短并不取決于堆內(nèi)對(duì)象的多少也不是堆的大小,而是存活對(duì)象的多少。因此,調(diào)高堆的大小并不會(huì)影響到標(biāo)記階段的時(shí)間長(zhǎng)短。

當(dāng)標(biāo)記階段完成后,GC開(kāi)始進(jìn)入下一階段,刪除不可達(dá)對(duì)象。

?

刪除無(wú)用對(duì)象

不同的GC算法在刪除無(wú)用對(duì)象上的做法會(huì)有所不同,不過(guò)大致上可以為分三類:清除(Sweeping),整理/壓縮(Compacting)以及拷貝(Copying)。下面的幾節(jié)將會(huì)詳細(xì)介紹下這幾種算法的不同。

清除

從概念上來(lái)講,標(biāo)記-清除算法使用的方法是最簡(jiǎn)單的,只需要忽略這些對(duì)象便可以了。也就是說(shuō)當(dāng)標(biāo)記階段完成之后,未被訪問(wèn)到的對(duì)象所在的空間都會(huì)被認(rèn)為是空閑的,可以用來(lái)創(chuàng)建新的對(duì)象。

這種方法需要使用一個(gè)空閑列表來(lái)記錄所有的空閑區(qū)域以及大小。對(duì)空閑列表的管理會(huì)增加分配對(duì)象時(shí)的工作量。這種方法還有一個(gè)缺陷就是——雖然空閑區(qū)域的大小是足夠的,但卻可能沒(méi)有一個(gè)單一區(qū)域能夠滿足這次分配所需的大小,因此本次分配還是會(huì)失敗(在Java中就是一次OutOfMemoryError)。

整理

標(biāo)記-清除-整理算法修復(fù)了標(biāo)記-清除算法的短板——它將所有標(biāo)記的也就是存活的對(duì)象都移動(dòng)到內(nèi)存區(qū)域的開(kāi)始位置。這種方法的缺點(diǎn)就是GC暫停的時(shí)間會(huì)增長(zhǎng),因?yàn)槟阈枰獙⑺械膶?duì)象都拷貝到一個(gè)新的地方,還得更新它們的引用地址。相對(duì)于標(biāo)記-清除算法,它的優(yōu)點(diǎn)也是顯而易見(jiàn)的——經(jīng)過(guò)整理之后,新對(duì)象的分配只需要通過(guò)指針碰撞便能完成(pointer bumping),相當(dāng)簡(jiǎn)單。使用這種方法空閑區(qū)域的位置是始終可知的,也不會(huì)再有碎片的問(wèn)題了。

復(fù)制

標(biāo)記-復(fù)制算法與標(biāo)記-整理算法非常類似,它們都會(huì)將所有存活對(duì)象重新進(jìn)行分配。區(qū)別在于重新分配的目標(biāo)地址不同,復(fù)制算法是為存活對(duì)象分配了另外的內(nèi)存區(qū)域作為它們的新家。標(biāo)記復(fù)制算法的優(yōu)點(diǎn)在于標(biāo)記階段和復(fù)制階段可以同時(shí)進(jìn)行。它的缺點(diǎn)是需要一塊能容納下所有存活對(duì)象的額外的內(nèi)存空間。

總結(jié)

以上是生活随笔為你收集整理的GC算法基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。