垃圾回收原來是這麼回事

2021-02-13 ImportNew

(點擊上方公眾號,可快速關注)

來源:翟志軍,

showme.codes/2017-02-04/what-is-gc/

如有好文章投稿,請點擊 → 這裡了解詳情

摘要:John McCarthy身為Lisp之父和人工智慧之父,同時,他也是GC之父。1960年,他在其論文中首次發布了GC算法(其實是委婉的提出)。而Java的前身Oak是在1990發布的,利用JVM實現了跨平臺。GC因此一舉成名。

最近想複習一下JVM的知識。然後發現網上不少文章在寫JVM的垃圾回收算法時,都比較偏向於具體實現,而少有站在更高角度來看垃圾回收算法的文章。而我本人想對垃圾回收算法有個全景的認識,所以,就找到了這本《垃圾回收的算法與實現》(以下簡稱《垃圾回收》)。本篇博客就是嘗試對「全景」的總結。

以下為方便討論,垃圾回收縮寫成GC。

為什麼要有GC

我時而聽到C++程式設計師說我們是被GC慣壞了的一代。的確是這樣的,我本人在學習GC算法時,大腦裡第一問題就是為什麼需要GC這樣的東西。說明我已經認為GC是理所當然了。

總的一句話:沒有GC的世界,我們需要手動進行內存管理,而手動內存管理是純技術活,又容易出錯。

既然我們寫的大多程序都是為了解決現實業務問題,那麼,我們為什麼不把這種純技術活自動化呢?但是自動化,也是有代價的。 這是我的個人理解,不代表John McCarthy本人的理解。

「垃圾」的定義

首先,我們要給個「垃圾」的定義,才能進行回收吧。書中給出的定義: > 把分配到堆中那些不能通過程序引用的對象稱為非活動對象,也就是死掉的對象,我們稱為「垃圾」。

GC的定義

因為我們期望讓內存管理變得自動(只管用內存,不管內存的回收),我們就必須做兩件事情: > 1. 找到內存空間裡的垃圾 > 2. 回收垃圾,讓程式設計師能再次利用這部分空間 [1] 只要滿足這兩項功能的程序,就是GC,不論它是在JVM中,還是在Ruby的VM中。

但這只是兩個需求,並沒有說明GC應該何時找垃圾,何時回收垃圾等等更具體的問題,各類GC算法就是在這些更具體問題的處理方式上施展手腳。

GC的歷史

John McCarthy身為Lisp之父和人工智慧之父,同時,他也是GC之父。1960年,他在其論文中首次發布了GC算法(其實是委婉的提出😂)。

標記-清除算法 由John McCarthy在1960年提出

引用計數法 由George E. Collins在1960年提出 此算法會有循環引用問題,Harold McBeth 1963年指出。

複製算法 由Marvin L. Minsky在1963年提出

《垃圾回收》的作者認為:

從50年前GC算法首次發布以來,眾多研究者對其進行了各種各樣的研究,因此許多GC算法也得以發布。[2] 但事實上,這些算法只不過是把前文中提到的三種算法進行組合或應用。也可以這麼說,1963年GC複製算法誕生時,GC的根本性內容就已經完成了。[3]

那我們常常聽說的分代垃圾回收又是怎麼回事?作者是這樣說的: > 人們從眾多程序案例中總結出了一個經驗:「大部分的對象在生成後馬上就變成了垃圾,很少有對象能活得很久」。分代垃圾回收利用該經驗,在對象中導入了「年齡」的概念,經歷過一次GC後活下來的對象年齡為1歲。[4]

分代垃圾回收中把對象分類成幾代,針對不同的代使用不同的GC算法,我們把剛生成的對象稱為新生代對象,到達一定年齡的對象則稱為老年代對象。[5]

好了,這下我總算知道為什麼要分代了,我的總結是: 將對象根據存活概率進行分類,對存活時間長一些的對象,可以減少掃描「垃圾」的時間,以減少GC頻率和時長。根本思路就是對對象進行分類,才能針對各個分類採用不同的垃圾回收算法,以對各算法進行揚長避短。

留一個問題給讀者:我們知道分代垃圾回收所採用的堆結構是:

為什麼新生代空間要分成「生成空間」和「倖存空間」,而倖存空間又分成兩塊大小相等的倖存空間1,倖存空間2?

這些GC算法共同解決的問題

上面我們說了,GC的定義只給出了需求,三種算法都為實現這個需求,那麼它們總會遇到共同要解決的問題吧? 我嘗試總結出:

如何分辨出什麼是垃圾?

如何、何時搜索垃圾?

如何、何時清除垃圾?

這樣,只要涉及到垃圾回收,我就可以從這2點需求,3個共同問題(兩點三共)出發來討論、學習。

如何評價GC算法?

如果沒有評價標準,我們當然無法評估這些GC算法的性能。作者給出了4個標準:

吞吐量: 單位時間內的處理能力

最大暫停時間:GC執行過程中,應用暫停的時長。 較大的吞吐量和較短的最大暫停時間不可兼得

堆的使用效率:就是堆空間的利用率。 可用的堆越大,GC運行越快;相反,越想有效地利用有限的堆,GC花費的時間就越長。

訪問的局部性:把具有引用關係的對象安排在堆中較近的位置,就能提高在緩存中讀取到想利用的數據的概率。

好吧。兩點三共,四標~

小結

搞清楚為什麼要GC,要實現GC都要解決什麼問題,而各類算法又是怎麼解決的,最後怎麼評價這些算法。GC原來是這麼回事。

但是這不是GC的全部。但是提供我一個思考GC的思考框架。

以上就是《垃圾回收的算法與實現》的讀書筆記。如果想更深入,可以閱讀《垃圾回收算法手冊:自動內存管理的藝術》。

[1] 《垃圾回收的算法與實現》 P2

[2][3] 《垃圾回收的算法與實現》 P4

[4] 《垃圾回收的算法與實現》 P141

[5] 《垃圾回收的算法與實現》 P142

覺得本文對你有幫助?請分享給更多人

關注「ImportNew」,提升Java技能

相關焦點

  • 有了垃圾分類指南圖,在魔都分類垃圾原來這麼簡單,
    在魔都上海分類垃圾原來這麼簡單,垃圾分類指南圖《上海市生活垃圾管理條例》生效在即,據說,每天喚醒上海人的不再是鬧鐘,而是搶扔垃圾。乾濕分類垃圾桶熱賣,廚餘垃圾粉碎機脫銷,小小垃圾讓魔都很拼。垃圾分類投放指南一.可回收垃圾,適合回收可循環利用的生活廢棄物,投放可回收廢棄物時應儘量保持清潔乾燥,避免汙染,立體包裝的應清空內容物,清潔後壓扁投放,易破損的或有尖銳邊角的應包裹後投放
  • 垃圾回收站垃圾製成兒童玩具 味道大有毒
    記者甚至還發現竟有很多使用過的一次性注射器、輸液管、藥瓶等醫療垃圾。  回收站負責人:這都是從醫院收回來的,不是醫院收回來的哪有這麼多廢品(醫療廢物)。  解說:我國法律明令禁止醫療垃圾回流社會,必須按規定進行銷毀。因為醫療垃圾中的病原微生物容易造成傳染性疾病,所含致病細菌及病毒是普通生活垃圾的幾十倍甚至上千倍。回收站的負責人卻說,這些塑料醫療垃圾可是本地的搶手貨。
  • 回收新模式高效又環保 垃圾智能回收太原駛上快車道
    用微信預約可以上門回收廢品,把垃圾放進智能回收箱可換生活用品……近日,在我市很多小區都出現了方便快捷的垃圾智能回收,傳統的依靠人力
  • 國外網際網路公司靠垃圾回收營收過億,垃圾竟然這麼值錢
    在美國維吉尼亞州羅諾克的回收中心裡,兩臺 300 磅長的像蜘蛛一樣的機器人正在整理著沒完沒了的垃圾。其中一臺機器人的"長手",正依靠計算機視覺檢測可回收物,它從傳送帶上摘下一大塊藍色塑料,而另一臺機器人則抓起一個舊水瓶。隨後,機器使用真空抓手將這些碎片放入分類箱中。
  • 電子垃圾回收
    總結,電子垃圾回收處理,作為垃圾分類的一部分,是末端決定前端的工作,如果一項分類後垃圾沒有明確的歸宿,那麼這項垃圾去分類就沒有意義,最終還會走向垃圾填埋場。垃圾分類需要明確每一種垃圾的準確歸宿,垃圾分類才有意義,垃圾分類也才能有效的推行。
  • 變廢為寶的垃圾回收
    垃圾是放錯位置的資源。從垃圾產生到回收利用的整個過程中,垃圾分類是一大前提。嚴格的垃圾分類制度,是對垃圾分流並有效利用的重要保證。我們最常見的垃圾分類為:可回收垃圾和不可回收垃圾兩類。可回收垃圾是指那些可以循環再生的垃圾,如生活中常見的紙類、塑料、玻璃、金屬、織物及瓶罐等,這些垃圾都能通過重新加工處理被再次利用,從而有效節省了資源,減少對環境的危害;不可回收垃圾基本上是指除了可回收垃圾之外的垃圾,如剩飯菜、瓜果皮核、動物內臟、盆景等植物的殘枝落葉等。
  • Java垃圾回收機制(GC)—怎麼回收垃圾(內存)?
    Java垃圾回收機制提供了一些算法來回收垃圾對象內存:Tracing算法(Tracing Collector)或標記-清除算法標記-清除算法是最基礎的收集算法,為了解決引用計數法的問題而提出的。它使用了根集的概念,它分為「標記」和「清除」兩個階段:首先標記出所需回收的對象,在標記完成後統一回收掉所有被標記的對象,它的標記過程其實就是對前面的根搜索算法中判定垃圾對象的標記過程。優點:不需要進行對象的移動,並且僅對不存活的對象進行處理,在存活對象比較多的情況極為有效。
  • 上海那些被垃圾分類搞瘋狂的網民,有哪幾種垃圾的分類?
    原標題:上海那些被垃圾分類搞瘋狂的網民,有哪幾種垃圾的分類?   最近,上海居民已經開始對垃圾進行分類了,不過這件事被推上了熱搜了。   是咋回事呢?   原來,上海居民快被垃圾分類逼瘋了,這次的垃圾分類不像以前了,分了好幾種,也更嚴格了,所以上海居民為了搞懂哪些垃圾是哪些分類,已經焦頭爛額了。
  • 百度回收站:電子垃圾回收的正規軍
    手機拍攝家中廢舊電器,「百度回收站」自動識別電子垃圾類別並顯示回收價格。8月18日,聯合國百度大數據聯合實驗室在北京成立,將利用百度強大的技術創新實力,助力聯合國解決環保、健康等人類發展問題。實驗室同步發布了第一個環保解決方案——「百度回收站」輕應用,旨在搭建消費者處理電子垃圾的一站式平臺。
  • 可回收垃圾真的被回收利用了嗎?
    我們扔進「可回收物」垃圾桶裡的東西真的被回收利用了嗎?當垃圾車把你丟棄的可回收垃圾運走後,你可能會突然想到一個可怕的問題:這些東西會被運到哪裡去?它們真的會被回收利用嗎?1973年,大學城成為美國第一個開展舊報紙循環利用的城市。到2006年,全美國有大約8660個路邊回收站。一開始,人們必須將垃圾分類。
  • 這個國家垃圾回收利用率高達99%,分類十多種!留學生只能這麼幹……
    在北歐,有這樣一個國家,用一代人的時間,將垃圾分類做到極致,不僅家裡垃圾要分10多種,亂扔垃圾還要接受國外「朝陽大媽」的監視舉報。現在,這個國家的垃圾填埋率只有1%左右,也就是說,垃圾回收利用率高達99%,其中36%被回收使用,14%用作肥料,49%焚燒後轉變為能源。這個國家,就是瑞典。
  • 這個國家垃圾回收利用率高達99%,分類十多種!留學生只能這麼幹…
    在北歐,有這樣一個國家,用一代人的時間,將垃圾分類做到極致,不僅家裡垃圾要分10多種,亂扔垃圾還要接受國外「朝陽大媽」的監視舉報。現在,這個國家的垃圾填埋率只有1%左右,也就是說,垃圾回收利用率高達99%,其中36%被回收使用,14%用作肥料,49%焚燒後轉變為能源。
  • 看臺灣如何有效實現垃圾分類回收
    這還要從臺灣的「垃圾不落地」政策說起。臺灣從上世紀90年代開始實行「垃圾不落地」政策,小區內不設垃圾桶、垃圾箱、密閉式清潔站等生活垃圾暫存和中轉設施,居民必須在家裡對垃圾進行粗分類,不分類則會被拒收或被處罰。臺灣的分類垃圾桶      臺灣的垃圾回收分類細緻,主要分為普通垃圾、可回收垃圾和廚餘垃圾三大類。
  • 可回收垃圾,英語你能說出幾種?
    ,原來老美的垃圾分類做得並不盡人意:點擊回顧上集那麼,哪些垃圾可以回收?美國留學生Lin聽說Hunter家的生活垃圾每周三和周五收,回收垃圾每周二收,便問Hunter是不是免費的。for free是免費的意思。Hunter告訴Lin,垃圾、回收方面的錢都是他房東付的。
  • 幻書也要實行垃圾分類?文華:都是可回收垃圾,讓我調教一下!
    幻書中也要實行垃圾分類哦,幹垃圾、溼垃圾。讓我看看梅是什麼垃圾,原來是可回收垃圾。就讓我回收一下好好調教吧。其他幻書這麼可愛,我一拳下去,可能會哭很久吧。哦裂瓦文華,哦裂瓦幻書的終結者。一年12個月我最討厭2月,因為只能欺負其他幻書28天。你以為幻書中的萌妹子都是一口一個嚶嚶嚶?不,那只是你還沒有看見文華公主。
  • 垃圾回收四十年①|民間廢品回收網絡是如何形成的
    中國在改革開放後的40年快速城市化過程中,垃圾問題也逐漸進入公眾視野,不再是政府規劃和部署的內部事務。在各種末端處理方式,尤其是垃圾焚燒和填埋不被社會認可的過程中,垃圾分類成為社會各方的共同認識。垃圾分類也就意味著各種不同垃圾在產生地方應該被分類。
  • ...的回收垃圾,竟在馬來西亞被偷偷焚燒了…!還有必要搞recycle嗎?
    這到底是怎麼回事?,垃圾都到馬來西亞這樣的國家來了,而且沒有被回收。」   「到底咋回事啊,難道沒有一個有責任感的人嗎,為什麼掌權的一個個都沒有作為!
  • 多個小區及菜市場出現「難回收的可回收垃圾」 泡沫塑料回收難問題...
    泡沫塑料箱回收小區「遇冷」「泡沫塑料到底算什麼垃圾?」在垃圾分類時,不少市民有此疑問。在多個版本的垃圾分類宣傳圖冊上,並未特別提及泡沫塑料的分類,使用北京垃圾分類智能查詢可以清楚地看到,泡沫塑料屬於可回收物。水果、生鮮甚至家電的包裹,為了保鮮或避免磕碰,外包裝難免會使用這一材料。
  • 可回收物分七類,有害垃圾分八類,上海這兩個小區探索垃圾分類新...
    負責閔行七寶鎮部分小區生活垃圾分類投放的第三方機構上海興冬環保科技有關公司的雷慈嘉這樣告訴記者。探索方向一:精細分類,可回收物「大有可為」走進七寶鎮航華三村一街坊,小區小花園旁豎立著一個巨大的綠色「玻璃瓶」,旁邊還有一個24小時可回收物分類投放設備。巨大的「玻璃瓶」其實是一個玻璃瓶回收設備,居民可以將醬油瓶、酒瓶等各類玻璃瓶投放進去。
  • 手機一鍵預約 垃圾上門回收
    現在方便多了,用手機隨時預約上門回收,就有人來家裡把廢品取走了。」家住大連市民興花園的居民盛淑珍告訴記者。 在大連,有一部分居民已經可以通過手機操作,實現可回收垃圾預約上門收購。這一安全便捷的回收方式,源於大連繫民環境資源有限公司的網絡服務模式。