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

java垃圾回收原理之GC算法基礎(chǔ)

 更新時(shí)間:2022年01月25日 15:21:23   作者:金色  
本章簡(jiǎn)要介紹GC的基本原理和相關(guān)技術(shù), 下一章節(jié)再詳細(xì)講解GC算法的具體實(shí)現(xiàn)。各種垃圾收集器的實(shí)現(xiàn)細(xì)節(jié)雖然并不相同,但總體而言,垃圾收集器都專注于兩件事情:查找所有存活對(duì)象,拋棄其他的部分,即死對(duì)象,不再使用的對(duì)象

正文:

相關(guān)術(shù)語翻譯說明:

Mark,標(biāo)記;

Sweep,清除;

Compact,整理; 也有人翻譯為壓縮,譯者認(rèn)為GC時(shí)不存在壓縮這回事。

Copy,復(fù)制; copy 用作名詞時(shí)一般翻譯為拷貝/副本,用作動(dòng)詞時(shí)翻譯為復(fù)制。

注: 《垃圾回收算法手冊(cè)》將 Mark and Sweep 翻譯為: 標(biāo)記-清掃算法; 譯者認(rèn)為 標(biāo)記-清除 更容易理解。

本章簡(jiǎn)要介紹GC的基本原理和相關(guān)技術(shù), 下一章節(jié)再詳細(xì)講解GC算法的具體實(shí)現(xiàn)。各種垃圾收集器的實(shí)現(xiàn)細(xì)節(jié)雖然并不相同,但總體而言,垃圾收集器都專注于兩件事情:

  • 查找所有存活對(duì)象
  • 拋棄其他的部分,即死對(duì)象,不再使用的對(duì)象。

第一步, 記錄(census)所有的存活對(duì)象, 在垃圾收集中有一個(gè)叫做 標(biāo)記(Marking) 的過程專門干這件事。

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

現(xiàn)代JVM中所有的GC算法,第一步都是找出所有存活的對(duì)象。下面的示意圖對(duì)此做了最好的詮釋:

首先,有一些特定的對(duì)象被指定為 Garbage Collection Roots(GC根元素)。包括:

  • 當(dāng)前正在執(zhí)行的方法里的局部變量和輸入?yún)?shù)
  • 活動(dòng)線程(Active threads)
  • 內(nèi)存中所有類的靜態(tài)字段(static field)
  • JNI引用

其次, GC遍歷(traverses)內(nèi)存中整體的對(duì)象關(guān)系圖(object graph),從GC根元素開始掃描, 到直接引用,以及其他對(duì)象(通過對(duì)象的屬性域)。所有GC訪問到的對(duì)象都被標(biāo)記(marked)為存活對(duì)象。

存活對(duì)象在上圖中用藍(lán)色表示。標(biāo)記階段完成后, 所有存活對(duì)象都被標(biāo)記了。而其他對(duì)象(上圖中灰色的數(shù)據(jù)結(jié)構(gòu))就是從GC根元素不可達(dá)的, 也就是說程序不能再使用這些不可達(dá)的對(duì)象(unreachable object)。這樣的對(duì)象被認(rèn)為是垃圾, GC會(huì)在接下來的階段中清除他們。

在標(biāo)記階段有幾個(gè)需要注意的點(diǎn):

在標(biāo)記階段,需要暫停所有應(yīng)用線程, 以遍歷所有對(duì)象的引用關(guān)系。因?yàn)椴粫和>蜎]法跟蹤一直在變化的引用關(guān)系圖。這種情景叫做 Stop The World pause (全線停頓),而可以安全地暫停線程的點(diǎn)叫做安全點(diǎn)(safe point), 然后, JVM就可以專心執(zhí)行清理工作。安全點(diǎn)可能有多種因素觸發(fā), 當(dāng)前, GC是觸發(fā)安全點(diǎn)最常見的原因。

此階段暫停的時(shí)間, 與堆內(nèi)存大小,對(duì)象的總數(shù)沒有直接關(guān)系, 而是由存活對(duì)象(alive objects)的數(shù)量來決定。所以增加堆內(nèi)存的大小并不會(huì)直接影響標(biāo)記階段占用的時(shí)間。

標(biāo)記 階段完成后, GC進(jìn)行下一步操作, 刪除不可達(dá)對(duì)象。

刪除不可達(dá)對(duì)象(Removing Unused Objects)

各種GC算法在刪除不可達(dá)對(duì)象時(shí)略有不同, 但總體可分為三類: 清除(sweeping)、整理(compacting)和復(fù)制(copying)。下一章節(jié)將詳細(xì)講解這些算法。

Sweep(清除)

Mark and Sweep(標(biāo)記-清除) 算法的概念非常簡(jiǎn)單: 直接忽略所有的垃圾。也就是說在標(biāo)記階段完成后, 所有不可達(dá)對(duì)象占用的內(nèi)存空間, 都被認(rèn)為是空閑的, 因此可以用來分配新對(duì)象。

這種算法需要使用 空閑表(free-list),來記錄所有的空閑區(qū)域, 以及每個(gè)區(qū)域的大小。維護(hù)空閑表增加了對(duì)象分配時(shí)的開銷。此外還存在另一個(gè)弱點(diǎn) —— 明明還有很多空閑內(nèi)存, 卻可能沒有一個(gè)區(qū)域的大小能夠存放需要分配的對(duì)象, 從而導(dǎo)致分配失敗(在Java 中就是 OutOfMemoryError)。

Compact(整理)

標(biāo)記-清除-整理算法(Mark-Sweep-Compact), 將所有被標(biāo)記的對(duì)象(存活對(duì)象), 遷移到內(nèi)存空間的起始處, 消除了標(biāo)記-清除算法的缺點(diǎn)。 相應(yīng)的缺點(diǎn)就是GC暫停時(shí)間會(huì)增加, 因?yàn)樾枰獙⑺袑?duì)象復(fù)制到另一個(gè)地方, 然后修改指向這些對(duì)象的引用。此算法的優(yōu)勢(shì)也很明顯, 碎片整理之后, 分配新對(duì)象就很簡(jiǎn)單, 只需要通過指針碰撞(pointer bumping)即可。使用這種算法, 內(nèi)存空間剩余的容量一直是清楚的, 不會(huì)再導(dǎo)致內(nèi)存碎片問題。

Copy(復(fù)制)

標(biāo)記-復(fù)制算法(Mark and Copy) 和 標(biāo)記-整理算法(Mark and Compact) 十分相似: 兩者都會(huì)移動(dòng)所有存活的對(duì)象。區(qū)別在于, 標(biāo)記-復(fù)制算法是將內(nèi)存移動(dòng)到另外一個(gè)空間: 存活區(qū)。標(biāo)記-復(fù)制方法的優(yōu)點(diǎn)在于: 標(biāo)記和復(fù)制可以同時(shí)進(jìn)行。缺點(diǎn)則是需要一個(gè)額外的內(nèi)存區(qū)間, 來存放所有的存活對(duì)象。

以上就是java垃圾回收之GC算法基礎(chǔ)原理詳解的詳細(xì)內(nèi)容,更多關(guān)于java垃圾回收GC算法基礎(chǔ)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

原文鏈接:https://plumbr.io/handbook/garbage-collection-algorithms#sweep

相關(guān)文章

  • SpringCloud?OpenFeign概述與使用教程

    SpringCloud?OpenFeign概述與使用教程

    OpenFeign源于Netflix的Feign,是http通信的客戶端。屏蔽了網(wǎng)絡(luò)通信的細(xì)節(jié),直接面向接口的方式開發(fā),讓開發(fā)者感知不到網(wǎng)絡(luò)通信細(xì)節(jié)。所有遠(yuǎn)程調(diào)用,都像調(diào)用本地方法一樣完成
    2023-02-02
  • Java中Properties的使用詳解

    Java中Properties的使用詳解

    這篇文章主要介紹了Java中Properties的使用詳解的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • mybatis/mybatis-plus模糊查詢語句特殊字符轉(zhuǎn)義攔截器的實(shí)現(xiàn)

    mybatis/mybatis-plus模糊查詢語句特殊字符轉(zhuǎn)義攔截器的實(shí)現(xiàn)

    在開發(fā)中,我們通常會(huì)遇到這樣的情況。用戶在錄入信息是錄入了‘%’,而在查詢時(shí)無法精確匹配‘%’。究其原因,‘%’是MySQL的關(guān)鍵字,如果我們想要精確匹配‘%’,那么需要對(duì)其進(jìn)行轉(zhuǎn)義,本文就詳細(xì)的介紹一下
    2021-11-11
  • SpringSecurity的TokenStore四種實(shí)現(xiàn)方式小結(jié)

    SpringSecurity的TokenStore四種實(shí)現(xiàn)方式小結(jié)

    本文主要介紹了SpringSecurity的TokenStore四種實(shí)現(xiàn)方式小結(jié),分別是InMemoryTokenStore,JdbcTokenStore,JwkTokenStore,RedisTokenStore,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之學(xué)生管理系統(tǒng)的實(shí)現(xiàn)

    Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之學(xué)生管理系統(tǒng)的實(shí)現(xiàn)

    只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+Springboot+Maven+mybatis+Vue+Mysql實(shí)現(xiàn)學(xué)生管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2022-03-03
  • SpringBoot設(shè)置動(dòng)態(tài)定時(shí)任務(wù)的方法詳解

    SpringBoot設(shè)置動(dòng)態(tài)定時(shí)任務(wù)的方法詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot設(shè)置動(dòng)態(tài)定時(shí)任務(wù)的方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定的參考價(jià)值,需要的可以參考一下
    2022-06-06
  • 詳解JAVA 七種創(chuàng)建單例的方法

    詳解JAVA 七種創(chuàng)建單例的方法

    這篇文章主要介紹了詳解JAVA 七種創(chuàng)建單例的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • java?mybatis如何操作postgresql?array數(shù)組類型

    java?mybatis如何操作postgresql?array數(shù)組類型

    這篇文章主要介紹了java?mybatis如何操作postgresql?array數(shù)組類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • springboot多環(huán)境配置方案(不用5分鐘)

    springboot多環(huán)境配置方案(不用5分鐘)

    這篇文章主要介紹了springboot多環(huán)境配置方案(不用5分鐘),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 教你使用springSecurity+jwt實(shí)現(xiàn)互踢功能

    教你使用springSecurity+jwt實(shí)現(xiàn)互踢功能

    JWT作為一個(gè)開放的標(biāo)準(zhǔn)( RFC 7519 ),定義了一種簡(jiǎn)潔的,自包含的方法用于通信雙方之間以Json對(duì)象的形式安全的傳遞信息。接下來通過本文給大家介紹springSecurity+jwt實(shí)現(xiàn)互踢功能,需要的朋友可以參考下
    2021-11-11

最新評(píng)論

达州市| 霍城县| 大荔县| 洪湖市| 加查县| 哈尔滨市| 霍林郭勒市| 连平县| 灵川县| 赣州市| 聂拉木县| 来凤县| 两当县| 旌德县| 宝兴县| 麦盖提县| 塔河县| 富阳市| 古丈县| 天峨县| 绥德县| 花莲县| 库尔勒市| 涞水县| 屯留县| 高平市| 图片| 密云县| 应用必备| 静海县| 乌兰察布市| 永安市| 淮阳县| 嘉善县| 漠河县| 门头沟区| 平泉县| 镇宁| 台江县| 上林县| 龙泉市|