最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GC參考手冊(cè)jvm垃圾回收詳解

 更新時(shí)間:2022年01月25日 14:38:49   作者:金色夢(mèng)想  
顧名思義,垃圾收集(Garbage?Collection)的意思就是?——?找到垃圾并進(jìn)行清理。但現(xiàn)有的垃圾收集實(shí)現(xiàn)卻恰恰相反:?垃圾收集器跟蹤所有正在使用的對(duì)象,并把其余部分當(dāng)做垃圾。記住這一點(diǎn)以后,?我們?cè)偕钊胫v解內(nèi)存自動(dòng)回收的原理,探究?JVM?中垃圾收集的具體實(shí)現(xiàn)

1,什么是垃圾回收?

顧名思義,垃圾收集(Garbage Collection)的意思就是 —— 找到垃圾并進(jìn)行清理。但現(xiàn)有的垃圾收集實(shí)現(xiàn)卻恰恰相反: 垃圾收集器跟蹤所有正在使用的對(duì)象,并把其余部分當(dāng)做垃圾

我們不摳細(xì)節(jié), 先從基礎(chǔ)開始, 介紹垃圾收集的一般特征、核心概念以及實(shí)現(xiàn)算法。

2,手動(dòng)內(nèi)存管理(Manual Memory Management)

當(dāng)今的自動(dòng)垃圾收集算法極為先進(jìn), 但我們先來看看什么是手動(dòng)內(nèi)存管理。在那個(gè)時(shí)候, 如果要存儲(chǔ)共享數(shù)據(jù), 必須顯式地進(jìn)行 內(nèi)存分配(allocate)和內(nèi)存釋放(free)。如果忘記釋放, 則對(duì)應(yīng)的那塊內(nèi)存不能再次使用。內(nèi)存一直被占著, 卻不再使用,這種情況就稱為內(nèi)存泄漏(memory leak)。

以下是用C語言來手動(dòng)管理內(nèi)存的一個(gè)示例程序:

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;
}

可以看到,如果程序很長(zhǎng),或者結(jié)構(gòu)比較復(fù)雜, 很可能就會(huì)忘記釋放內(nèi)存。內(nèi)存泄漏曾經(jīng)是個(gè)非常普遍的問題, 而且只能通過修復(fù)代碼來解決。因此,業(yè)界迫切希望有一種更好的辦法,來自動(dòng)回收不再使用的內(nèi)存,完全消除可能的人為錯(cuò)誤。這種自動(dòng)機(jī)制被稱為 垃圾收集(Garbage Collection,簡(jiǎn)稱GC)。

智能指針(Smart Pointers)

第一代自動(dòng)垃圾收集算法, 使用的是引用計(jì)數(shù)(reference counting)。針對(duì)每個(gè)對(duì)象, 只需要記住被引用的次數(shù), 當(dāng)引用計(jì)數(shù)變?yōu)?時(shí), 這個(gè)對(duì)象就可以被安全地回收(reclaimed)了。一個(gè)著名的示例是 C++ 的共享指針(shared pointers):

int send_request() {
    size_t n = read_size();
    vector<int> elements = vector<int>(n);

    if(read_elements(elements.size(), &elements[0]) < n) {
        return -1;
    }

    return 0;
}

shared_ptr 被用來跟蹤引用的數(shù)量。作為參數(shù)傳遞時(shí)這個(gè)數(shù)字加1, 在離開作用域時(shí)這個(gè)數(shù)字減1。當(dāng)引用計(jì)數(shù)變?yōu)?時(shí), shared_ptr 自動(dòng)刪除底層的 vector。需要向讀者指出的是,這種方式在實(shí)際編程中并不常見, 此處僅用于演示。

int send_request() {
    size_t n = read_size();
    auto elements = make_shared<vector<int>>();

    // read elements

    store_in_cache(elements);

    // process elements further

    return 0;
}

現(xiàn)在,為了避免在下次調(diào)用函數(shù)時(shí)讀取元素,我們可能需要緩存它們。在這種情況下,當(dāng)它超出范圍時(shí)銷毀向量不是一種選擇。因此,我們使用 shared_ptr。它跟蹤對(duì)它的引用數(shù)量。這個(gè)數(shù)字隨著你的傳遞而增加,隨著它離開范圍而減少。一旦引用數(shù)達(dá)到零,  shared_ptr 就會(huì) 自動(dòng)刪除底層向量。

3,自動(dòng)內(nèi)存管理(Automated Memory Management)

上面的C++代碼中,我們要顯式地聲明什么時(shí)候需要進(jìn)行內(nèi)存管理。但不能讓所有的對(duì)象都具備這種特征呢? 那樣就太方便了, 開發(fā)者不再耗費(fèi)腦細(xì)胞, 去考慮要在何處進(jìn)行內(nèi)存清理。運(yùn)行時(shí)環(huán)境會(huì)自動(dòng)算出哪些內(nèi)存不再使用,并將其釋放。換句話說, 自動(dòng)進(jìn)行收集垃圾。第一款垃圾收集器是1959年為L(zhǎng)isp語言開發(fā)的, 此后 Lisp 的垃圾收集技術(shù)也一直處于業(yè)界領(lǐng)先水平。

引用計(jì)數(shù)(Reference Counting)

剛剛演示的C++共享指針方式, 可以應(yīng)用到所有對(duì)象。許多語言都采用這種方法, 包括 Perl、Python 和 PHP 等。下圖很好地展示了這種方式:

圖中綠色的云(GC ROOTS) 表示程序正在使用的對(duì)象。從技術(shù)上講, 這些可能是當(dāng)前正在執(zhí)行的方法中的局部變量,或者是靜態(tài)變量一類。在某些編程語言中,可能叫法不太一樣,這里不必?fù)该~。

藍(lán)色的圓圈表示可以引用到的對(duì)象, 里面的數(shù)字就是引用計(jì)數(shù)。然后, 灰色的圓圈是各個(gè)作用域都不再引用的對(duì)象?;疑膶?duì)象被認(rèn)為是垃圾, 隨時(shí)會(huì)被垃圾收集器清理。

看起來很棒, 是吧! 但這種方式有個(gè)大坑, 很容易被循環(huán)引用(detached cycle) 給搞死。任何作用域中都沒有引用指向這些對(duì)象,但由于循環(huán)引用, 導(dǎo)致引用計(jì)數(shù)一直大于零。如下圖所示:

看到了嗎? 紅色的對(duì)象實(shí)際上屬于垃圾。但由于引用計(jì)數(shù)的局限, 所以存在內(nèi)存泄漏。

當(dāng)然也有一些辦法來應(yīng)對(duì)這種情況, 例如 “弱引用”(‘weak’ references), 或者使用另外的算法來排查循環(huán)引用等。前面提到的 Perl、Python 和PHP 等語言, 都使用了某些方式來解決循環(huán)引用問題, 但本文不對(duì)其進(jìn)行討論。下面介紹JVM中使用的垃圾收集方法。

標(biāo)記-清除(Mark and Sweep)

首先, JVM 明確定義了什么是對(duì)象的可達(dá)性(reachability)。我們前面所說的綠色云這種只能算是模糊的定義, JVM 中有一類很明確很具體的對(duì)象, 稱為 垃圾收集根元素(Garbage Collection Roots),包括:

  • 局部變量(Local variables)
  • 活動(dòng)線程(Active threads)
  • 靜態(tài)域(Static fields)
  • JNI引用(JNI references)
  • 其他對(duì)象(稍后介紹 …)

JVM使用標(biāo)記-清除算法(Mark and Sweep algorithm), 來跟蹤所有的可達(dá)對(duì)象(即存活對(duì)象), 確保所有不可達(dá)對(duì)象(non-reachable objects)占用的內(nèi)存都能被重用。其中包含兩步:

  • Marking(標(biāo)記): 遍歷所有的可達(dá)對(duì)象,并在本地內(nèi)存(native)中分門別類記下。

  • Sweeping(清除): 這一步保證了,不可達(dá)對(duì)象所占用的內(nèi)存, 在之后進(jìn)行內(nèi)存分配時(shí)可以重用。

JVM中包含了多種GC算法, 如Parallel Scavenge(并行清除), Parallel Mark+Copy(并行標(biāo)記+復(fù)制) 以及 CMS, 他們?cè)趯?shí)現(xiàn)上略有不同, 但理論上都采用了以上兩個(gè)步驟。

標(biāo)記清除算法最重要的優(yōu)勢(shì), 就是不再因?yàn)檠h(huán)引用而導(dǎo)致內(nèi)存泄露:

而不好的地方在于, 垃圾收集過程中, 需要暫停應(yīng)用程序的所有線程。假如不暫停,則對(duì)象間的引用關(guān)系會(huì)一直不停地發(fā)生變化, 那樣就沒法進(jìn)行統(tǒng)計(jì)了。這種情況叫做 STW停頓(Stop The World pause, 全線暫停), 讓應(yīng)用程序暫時(shí)停止,讓JVM進(jìn)行內(nèi)存清理工作。有很多原因會(huì)觸發(fā) STW停頓, 其中垃圾收集是最主要的因素。

在本手冊(cè)中,我們將介紹JVM中垃圾收集的實(shí)現(xiàn)原理,以及如何高效地利用GC。

以上就是GC參考手冊(cè)jvm垃圾回收詳解的詳細(xì)內(nèi)容,更多關(guān)于GC參考手冊(cè)jvm垃圾回收的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

原文鏈接:https://plumbr.io/handbook/what-is-garbage-collection

相關(guān)文章

  • Java中@ConfigurationProperties實(shí)現(xiàn)自定義配置綁定問題分析

    Java中@ConfigurationProperties實(shí)現(xiàn)自定義配置綁定問題分析

    這篇文章主要介紹了@ConfigurationProperties實(shí)現(xiàn)自定義配置綁定問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • 我總結(jié)的幾種@Transactional失效原因說明

    我總結(jié)的幾種@Transactional失效原因說明

    這篇文章主要是我總結(jié)的幾種@Transactional失效原因說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Mybatis-Plus樂觀鎖配置流程

    Mybatis-Plus樂觀鎖配置流程

    這篇文章主要介紹了Mybatis-Plus樂觀鎖配置使用流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作有一定的參考學(xué)習(xí)價(jià)值,感興趣的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2024-01-01
  • java實(shí)現(xiàn)文件夾上傳功能實(shí)例代碼(SpringBoot框架)

    java實(shí)現(xiàn)文件夾上傳功能實(shí)例代碼(SpringBoot框架)

    在web項(xiàng)目中上傳文件夾現(xiàn)在已經(jīng)成為了一個(gè)主流的需求,下面這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)文件夾上傳功能(springBoot框架)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Java嵌套for循環(huán)優(yōu)化方案分享

    Java嵌套for循環(huán)優(yōu)化方案分享

    介紹了Java中嵌套for循環(huán)的優(yōu)化方法,包括減少循環(huán)次數(shù)、合并循環(huán)、使用更高效的數(shù)據(jù)結(jié)構(gòu)、并行處理、預(yù)處理和緩存、算法優(yōu)化、盡量減少對(duì)象創(chuàng)建以及本地變量?jī)?yōu)化,通過這些方法,可以顯著提升程序的執(zhí)行效率,文章還以動(dòng)態(tài)規(guī)劃優(yōu)化示例——最長(zhǎng)遞增子序列
    2025-03-03
  • SpringBoot中Tomcat配置的示例代碼

    SpringBoot中Tomcat配置的示例代碼

    本文分享了在SpringBoot項(xiàng)目中配置Tomcat的一些心得和經(jīng)驗(yàn),包括Tomcat版本選擇、調(diào)整配置參數(shù)、自定義連接器、監(jiān)控和日志管理等方面,通過這些配置,可以有效提升應(yīng)用的性能、響應(yīng)速度和并發(fā)處理能力
    2024-11-11
  • 詳解Http請(qǐng)求中Content-Type講解以及在Spring MVC中的應(yīng)用

    詳解Http請(qǐng)求中Content-Type講解以及在Spring MVC中的應(yīng)用

    這篇文章主要介紹了Http請(qǐng)求中Content-Type講解以及在Spring MVC中的應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Hibernate+JDBC實(shí)現(xiàn)批量插入、更新及刪除的方法詳解

    Hibernate+JDBC實(shí)現(xiàn)批量插入、更新及刪除的方法詳解

    這篇文章主要介紹了Hibernate+JDBC實(shí)現(xiàn)批量插入、更新及刪除的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Hibernate與JDBC針對(duì)數(shù)據(jù)庫的批量操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-11-11
  • Spring?JPA?deleteInBatch導(dǎo)致StackOverflow問題

    Spring?JPA?deleteInBatch導(dǎo)致StackOverflow問題

    這篇文章主要介紹了Spring?JPA?deleteInBatch導(dǎo)致StackOverflow問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java中調(diào)用第三方接口的詳細(xì)代碼示例

    Java中調(diào)用第三方接口的詳細(xì)代碼示例

    這篇文章主要介紹了Java中調(diào)用第三方接口的詳細(xì)代碼示例,文章總結(jié)了多種Java進(jìn)行HTTP請(qǐng)求的方法,每種方法都有其特點(diǎn)和適用場(chǎng)景,從原生到封裝,再到聲明式客戶端,滿足了不同復(fù)雜度的HTTP請(qǐng)求需求,需要的朋友可以參考下
    2024-12-12

最新評(píng)論

瑞昌市| 罗田县| 凭祥市| 柞水县| 闵行区| 宜阳县| 乌什县| 武功县| 迭部县| 庄浪县| 琼中| 贵州省| 湘潭县| 金门县| 民乐县| 海丰县| 长泰县| 南康市| 鲁甸县| 新闻| 乐安县| 灵台县| 盘山县| 万宁市| 柞水县| 通辽市| 灵川县| 泉州市| 西乌| 习水县| 南宫市| 车险| 麻城市| 凌云县| 教育| 台中县| 晋江市| 元阳县| 衡山县| 大兴区| 荃湾区|