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

JVM中如何做到STW使程序暫停

 更新時間:2022年01月24日 11:27:33   作者:子牙_公號硬核子牙  
STW,即Stop The World,這篇文章來為大家詳細(xì)介紹了JVM中是如何做到STW使程序暫停的原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助

為什么需要STW呢?試想你媽給你打掃房間的場景:把你攆出去,關(guān)上門,打掃干凈,打開門,數(shù)落你,揍你…一套標(biāo)準(zhǔn)化流程后,房間干凈了。打完你,***心情變好了,打麻將都能多贏點。

這里面有個關(guān)鍵環(huán)節(jié):把你攆出去。盡管在打掃房間的過程中你可能不會制造垃圾,但是你的存在就有這個風(fēng)險,所以必須把你攆出去。這話不是我說的,是從***行為中揣摩出來的。^_^

試想,如果不把你攆出去,你媽打掃垃圾的同時,你又陸陸續(xù)續(xù)制造了垃圾,那這場打掃房間的行動是不是變成了無法結(jié)束的行動啊?;蛘叩侥硞€時間點,你媽打掃了一半走了,丟下一句話:朽木不可雕也,孺子不可教也。

垃圾收集器也是一樣的,為了保證清理垃圾的完整性,在某些環(huán)節(jié),就會STW。比如所有垃圾收集器中都有的一個階段:初始階段,即掃描根對象,需要STW。小伙伴門看過的幾乎所有資料,講到這基本就沒了對吧。但這不是子牙老師我的風(fēng)格,咱們接著往后面說。

STW

JVM中要做到STW是很難的。為什么這么說呢?因為需要考慮很多很多因素。

一、JVM中存在多種類型的會發(fā)生改變內(nèi)存行為的線程:

  • 執(zhí)行業(yè)務(wù)邏輯的用戶線程

  • 執(zhí)行native方法的Java線程

  • 執(zhí)行垃圾收集的GC線程

  • 執(zhí)行即時編譯的JIT線程

二、每種類型的線程個數(shù),在需要STW的那一刻,可能都不止一個。

三、每種類型的線程,在需要STW的那一刻,執(zhí)行到的代碼位置也未可知。

四、每種類型的線程阻塞的點還不能隨機。因為線程在阻塞前需要更新OopMap。

OopMap是什么?你可以理解成是記錄這個線程一路跑下來經(jīng)歷過的所有Java對象的集合。為什么要有OopMap呢?因為沒有的話,你就得掃描整個棧,去查找根對象。

這里說的只是查找根對象的一種情況哈,勿抬桿,我會記仇。^_^

如何暫停線程

聽我這么一分析,好像確實很復(fù)雜哈。那如果是你來實現(xiàn),你會怎么解決呢?小伙伴門可以想一想。經(jīng)常想這樣有深度的問題,有利于提高你的思考深度。

我們還是來看看JVM是如何高明地解決的吧。

如果線程隨便哪個位置阻塞都合適,這個問題就會簡單一百倍。但是這里簡單了,給其他地方就帶來了災(zāi)難。就是說線程阻塞前需要更新OopMap,如果不更新,沒有這個數(shù)據(jù)的話,GC時就需要掃描所有線程的所有棧的所有棧幀來查找根對象。

OopMap的存在,其實又是一種空間換時間的策略。因為相比內(nèi)存的價格,降低GC延時明顯更重要。

但是JVM的執(zhí)行流那么多,何時?在什么地方?更新OopMap呢?這就是安全點存在的意義。安全點同時解決了STW及更新OopMap。

其實也可以這樣說,不理解安全點就無法理解STW,甚至于無法理解GC。

安全點

安全點涉及的知識點非常多、非常底層。本篇文章就講安全點中與STW相關(guān)的知識點。其他的知識點后面會寫系列文章展開講。感興趣的小伙伴可以關(guān)注我公眾號關(guān)注我的發(fā)文動態(tài):硬核子牙。

這段代碼是大家看GC源碼時經(jīng)??吹降?/p>

SafepointSynchronize::begin

我把hotspot源碼中核心的代碼粘過來

這段代碼到底做了哪些事情呢:

  • 告訴JVM馬上要開始GC(下雨)了,開始做準(zhǔn)備工作了(準(zhǔn)備收衣服了)。本質(zhì)就是修改一些屬性位。比如第5行代碼,通知解釋器做好準(zhǔn)備工作,迎接GC到來。

  • 將polling_page對應(yīng)的物理頁設(shè)置成不可讀狀態(tài)。這步非常非常重要。等下說。

  • 不停檢測,確定是否所有的線程都已進(jìn)入安全點。只有都已進(jìn)入安全點,才能執(zhí)行GC邏輯。

STW的真面目

安全點是如何解決讓所有的線程都阻塞的呢?開啟安全點為什么要將物理頁的屬性改為不可讀呢?

因為JVM在生成執(zhí)行流代碼的時候,都會在適合作為安全點的地方插入一段代碼

這段代碼就是安全點的本質(zhì),也是觸發(fā)STW的本質(zhì)。什么意思呢?如果os::_polling_page對應(yīng)的物理頁屬性是可讀的,這段代碼并沒什么特殊意義。但是如果是不可讀的,讀的時候就會觸發(fā)段異常,對應(yīng)的操作系統(tǒng)信號:SIGSEGV。

JVM捕獲了這個異常,并進(jìn)行了處理。所有的線程都是在這個地方STW的。

這就是安全點難的地方,涉及到的知識點太多太底層!其實我搞手寫JVM小班的核心目的不是帶你寫一個JVM,其一是讓你通過手寫JVM了解hotspot的體系,你才能看得懂hotspot源碼。其二,也是最核心的,掌握底層。因為掌握了底層,你對技術(shù)就沒有恐懼之心了,你會覺得你無所不能。事實上,相對的無所不能是可以做到的,只是需要時間沉淀。啰嗦了兩句哈。

GC結(jié)束后喚醒所有阻塞的線程,小伙伴們應(yīng)該能想到是在哪里?如何喚醒的了吧

以上就是JVM中如何做到STW使程序暫停的詳細(xì)內(nèi)容,更多關(guān)于STW如何暫停程序的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 友盟 微信第三方登錄示例

    友盟 微信第三方登錄示例

    這篇文章主要介紹了友盟 微信第三方登錄示例的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • spring使用aspect注解切面不起作用的排查過程及解決

    spring使用aspect注解切面不起作用的排查過程及解決

    這篇文章主要介紹了spring使用aspect注解切面不起作用的排查過程及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot 整合 Netty 多端口監(jiān)聽的操作方法

    SpringBoot 整合 Netty 多端口監(jiān)聽的操作方法

    Netty提供異步的、基于事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用程序框架,用以快速開發(fā)高性能、高可靠性的網(wǎng)絡(luò) IO 程序,是目前最流行的 NIO 框架,這篇文章主要介紹了SpringBoot 整和 Netty 并監(jiān)聽多端口,需要的朋友可以參考下
    2023-10-10
  • 詳解Java 集合類 List 的那些坑

    詳解Java 集合類 List 的那些坑

    這篇文章主要介紹了Java 集合類 List 的那些坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • ArrayList及HashMap的擴容規(guī)則講解

    ArrayList及HashMap的擴容規(guī)則講解

    今天小編就為大家分享一篇關(guān)于ArrayList及HashMap的擴容規(guī)則講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • java  線程詳解及線程與進(jìn)程的區(qū)別

    java 線程詳解及線程與進(jìn)程的區(qū)別

    這篇文章主要介紹了java 線程詳解及線程與進(jìn)程的區(qū)別的相關(guān)資料,網(wǎng)上關(guān)于java 線程的資料很多,對于進(jìn)程的資料很是,這里就整理下,需要的朋友可以參考下
    2017-01-01
  • 淺談springboot項目中定時任務(wù)如何優(yōu)雅退出

    淺談springboot項目中定時任務(wù)如何優(yōu)雅退出

    這篇文章主要介紹了淺談springboot項目中定時任務(wù)如何優(yōu)雅退出?具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 減小Maven項目生成的JAR包體積實現(xiàn)提升運維效率

    減小Maven項目生成的JAR包體積實現(xiàn)提升運維效率

    在Maven構(gòu)建Java項目過程中,減小JAR包體積可通過排除不必要的依賴和使依賴jar包獨立于應(yīng)用jar包來實現(xiàn),在pom.xml文件中使用<exclusions>標(biāo)簽排除不需要的依賴,有助于顯著降低JAR包大小,此外,將依賴打包到應(yīng)用外,可減少應(yīng)用包的體積
    2024-10-10
  • 使用Jenkins來構(gòu)建SVN+Maven項目的實現(xiàn)

    使用Jenkins來構(gòu)建SVN+Maven項目的實現(xiàn)

    這篇文章主要介紹了使用Jenkins來構(gòu)建SVN+Maven項目的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java讀取其下所有文件夾與文件路徑的方法

    Java讀取其下所有文件夾與文件路徑的方法

    這篇文章主要為大家詳細(xì)介紹了Java讀取其下所有文件夾與文件路徑的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03

最新評論

司法| 呼图壁县| 航空| 错那县| 岗巴县| 江华| 阿图什市| 鱼台县| 巩义市| 临猗县| 北宁市| 县级市| 湖州市| 华坪县| 满洲里市| 卓尼县| 惠安县| 白银市| 汪清县| 盈江县| 和田市| 墨江| 淮南市| 大余县| 福建省| 顺昌县| 临朐县| 卢龙县| 砀山县| 正蓝旗| 眉山市| 大宁县| 电白县| 宁德市| 洛浦县| 庆安县| 辰溪县| 长海县| 安龙县| 沅江市| 油尖旺区|