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

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

生活随笔

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

编程问答

什么是垃圾回收?

發(fā)布時(shí)間:2023/12/3 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是垃圾回收? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

以下是我們的垃圾收集手冊(cè)中的一個(gè)示例,該手冊(cè)將在接下來(lái)的幾周內(nèi)發(fā)布。 同時(shí),花點(diǎn)時(shí)間熟悉垃圾收集的基礎(chǔ)知識(shí)-這將是本書的第一章。

乍一看,垃圾收集應(yīng)該處理顧名思義的問(wèn)題-查找并丟棄垃圾。 實(shí)際上,它所做的恰恰相反。 垃圾收集正在跟蹤所有仍在使用的對(duì)象,并將其余對(duì)象標(biāo)記為垃圾。 牢記這一點(diǎn),我們開(kāi)始深入研究如何為Java虛擬機(jī)實(shí)現(xiàn)稱為“垃圾回收”的自動(dòng)內(nèi)存回收過(guò)程。

手動(dòng)內(nèi)存管理

在我們開(kāi)始以現(xiàn)代形式介紹Garbage Collection之前,讓我們快速回顧一下您不得不手動(dòng)和顯式分配和釋放數(shù)據(jù)存儲(chǔ)空間的日子。 而且,如果您忘記釋放它,則將無(wú)法重用該內(nèi)存。 該內(nèi)存將被聲明但未被使用。 這種情況稱為內(nèi)存泄漏

這是一個(gè)使用C語(yǔ)言編寫的,使用手動(dòng)內(nèi)存管理的簡(jiǎn)單示例:

int send_request() {size_t n = read_size();int *elements = malloc(n * sizeof(int));if(read_elements(n, elements) < n) {// elements not freed!return -1;}// …free(elements)return 0; }

如我們所見(jiàn),忘記釋放內(nèi)存是很容易的。 內(nèi)存泄漏曾經(jīng)是比現(xiàn)在更常見(jiàn)的問(wèn)題。 您只能通過(guò)修復(fù)代碼來(lái)真正打敗他們。 因此,更好的方法將是自動(dòng)回收未使用的內(nèi)存,從而完全消除人為錯(cuò)誤的可能性。 這種自動(dòng)化稱為垃圾收集 (或簡(jiǎn)稱GC)。

智能指針

自動(dòng)進(jìn)行垃圾收集的第一種方法是基于引用計(jì)數(shù)。 對(duì)于每個(gè)對(duì)象,您只需知道它被引用了多少次,并且當(dāng)計(jì)數(shù)達(dá)到零時(shí),就可以安全地回收該對(duì)象。 一個(gè)著名的例子就是C ++的共享指針:

int send_request() {size_t n = read_size();stared_ptr<vector<int>> elements = make_shared(new vector<int>());if(read_elements(n, elements) < n) {return -1;}return 0; }

我們正在使用的shared_ptr會(huì)跟蹤對(duì)其的引用數(shù)。 此數(shù)字隨著您的傳遞而增加,而隨著其離開(kāi)范圍而減小。 一旦引用數(shù)達(dá)到零, shared_ptr就會(huì)自動(dòng)刪除基礎(chǔ)向量。

自動(dòng)內(nèi)存管理

在上面的C ++代碼中,我們?nèi)匀槐仨毭鞔_地說(shuō)出何時(shí)需要進(jìn)行內(nèi)存管理。 但是,如果我們可以使所有對(duì)象以這種方式表現(xiàn)呢? 這將非常方便,因?yàn)殚_(kāi)發(fā)人員可能不再需要考慮自己清理。 運(yùn)行時(shí)將自動(dòng)了解不再使用某些內(nèi)存,并將其釋放。 換句話說(shuō),它會(huì)自動(dòng)收集垃圾 。 1959年,第一個(gè)垃圾收集器出現(xiàn)在Lisp那里,從那時(shí)起,這項(xiàng)技術(shù)才發(fā)展起來(lái)。

參考計(jì)數(shù)

我們用C ++的共享指針演示的想法可以應(yīng)用于所有對(duì)象。 許多語(yǔ)言(例如Perl,Python或PHP)都采用這種方法。 最好用圖片說(shuō)明:

綠云表示程序員指向的對(duì)象仍在使用中。 從技術(shù)上講,這些可能是諸如當(dāng)前執(zhí)行的方法中的局部變量或靜態(tài)變量之類的東西。 它可能因編程語(yǔ)言而異,因此在此我們將不再關(guān)注。

藍(lán)色圓圈是內(nèi)存中的對(duì)象,您可以看到對(duì)其的引用數(shù)量。 最后,灰色圓圈是未從任何范圍引用的對(duì)象。 因此,灰色物體是垃圾,可以由垃圾收集器清理。

這一切看起來(lái)真的很好,不是嗎? 可以,但是整個(gè)方法都有很大的缺點(diǎn)。 結(jié)束對(duì)象的分離循環(huán)是很容易的,這些對(duì)象都不在范圍內(nèi),但是由于循環(huán)引用,其引用的計(jì)數(shù)不為零。 這是一個(gè)例子:

看到? 紅色對(duì)象實(shí)際上是應(yīng)用程序不使用的垃圾。 但是由于引用計(jì)數(shù)的限制,仍然存在內(nèi)存泄漏。

有一些方法可以解決此問(wèn)題,例如使用特殊的“弱”引用或應(yīng)用單獨(dú)的算法來(lái)收集周期。 提到的語(yǔ)言(Perl,Python和PHP)都以一種或另一種方式處理循環(huán),但這超出了本手冊(cè)的范圍。 相反,我們將開(kāi)始更詳細(xì)地研究JVM所采用的方法。

掃一掃

首先,JVM更具體地說(shuō)明了對(duì)象的可訪問(wèn)性。 與其在前幾章中看到的模糊定義的綠色云,不如我們有一組非常具體和明確的對(duì)象,稱為“ 垃圾收集根” :

  • 局部變量
  • 活動(dòng)線程
  • 靜態(tài)場(chǎng)
  • JNI參考
  • 其他(稍后將討論)

JVM用于跟蹤所有可到達(dá)(活動(dòng))對(duì)象并確保非可到達(dá)對(duì)象聲明的內(nèi)存可重復(fù)使用的方法稱為標(biāo)記和清除算法。 它包括兩個(gè)步驟:

  • 標(biāo)記正在遍歷所有可到達(dá)的對(duì)象,并在所有這些對(duì)象的本機(jī)內(nèi)存中保留分類帳
  • 掃描確保了不可訪問(wèn)對(duì)象占用的內(nèi)存地址可以在下一次分配中重用。

JVM中不同的GC算法,例如Parallel Scavenge,Parallel Mark + Copy或CMS,在實(shí)現(xiàn)這些階段時(shí)略有不同,但是從概念上講,該過(guò)程仍然類似于上述兩個(gè)步驟。

關(guān)于此方法,至關(guān)重要的一點(diǎn)是周期不再泄漏:

不好的是,需要停止應(yīng)用程序線程才能進(jìn)行收集,因?yàn)槿绻靡恢痹谧兓?#xff0c;那么您就無(wú)法真正計(jì)數(shù)引用。 當(dāng)應(yīng)用程序暫時(shí)停止以使JVM可以沉迷于家政活動(dòng)時(shí),這種情況稱為Stop The World暫停 。 它們的發(fā)生可能有多種原因,但是垃圾收集是迄今為止最受歡迎的一種。

如果您能夠通過(guò)發(fā)布獲得成功,那么我只能建議訂閱我們的Twitter feed ,在其中繼續(xù)發(fā)布與Java性能相關(guān)的其他主題。

翻譯自: https://www.javacodegeeks.com/2015/05/what-is-garbage-collection.html

總結(jié)

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

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