亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一文掌握J(rèn)VM?Safe?Point

 更新時(shí)間:2022年10月09日 09:23:22   作者:陳樹(shù)義  
關(guān)于?Safe?Point?是?JVM?中很關(guān)鍵的一個(gè)概念,但我估計(jì)有不少同學(xué)不是很懂,于是今天跟大家來(lái)深入聊聊?Safe?Point,通過(guò)本文學(xué)習(xí)你會(huì)了解什么是?Safe?Point?為啥需要?Safe?Point?Safe?Point?與?Stop?the?World?的關(guān)系?感興趣的朋友一起看看吧

大家好,我是樹(shù)哥。

關(guān)于 Safe Point 是 JVM 中很關(guān)鍵的一個(gè)概念,但我估計(jì)有不少同學(xué)不是很懂。于是今天跟大家來(lái)深入聊聊 Safe Point,希望通過(guò)這篇文章能解答這樣幾個(gè)問(wèn)題:

什么是 Safe Point?為啥需要 Safe Point?Safe Point 與 Stop the World 的關(guān)系?

什么是 Safe Point

正如 Safe Point 名稱的寓意一樣,Safe Point 是一個(gè)線程可以安全停留在這里的代碼點(diǎn)。當(dāng)我們需要進(jìn)行 GC 操作的時(shí)候,JVM 可以讓所有線程在 Safe Point 處停留下來(lái),等到所有線程都停在 Safe Point 處時(shí),就可以進(jìn)行內(nèi)存引用分析,從而確定哪些對(duì)象是存活的、哪些對(duì)象是不存活的。

為什么讓大家更加場(chǎng)景化地理解 Safe Point 這個(gè)概念,可以設(shè)想如下場(chǎng)景:

當(dāng)需要 GC 時(shí),需要知道哪些對(duì)象還被使用,或者已經(jīng)不被使用可以回收了,這樣就需要每個(gè)線程的對(duì)象使用情況。對(duì)于偏向鎖(Biased Lock),在高并發(fā)時(shí)想要解除偏置,需要線程狀態(tài)還有獲取鎖的線程的精確信息。對(duì)方法進(jìn)行即時(shí)編譯優(yōu)化(OSR 棧上替換),或者反優(yōu)化(bailout 棧上反優(yōu)化),這需要線程究竟運(yùn)行到方法的哪里的信息。

對(duì)于上面這些操作,都需要知道現(xiàn)場(chǎng)的各種信息,例如寄存器有什么內(nèi)容,堆使用情況等等。在做這些操作的時(shí)候,線程需要暫停,等到這些操作完成才行,否則會(huì)有并發(fā)問(wèn)題,這就需要 Safe Point 的存在。

因此,我們可以將 Safe Point 理解成代碼執(zhí)行過(guò)程中的一些特殊位置,當(dāng)線程執(zhí)行到這個(gè)位置時(shí),線程可以暫停。 Safe Point 處保存了其他位置沒(méi)有的一些當(dāng)前線程信息,可以提供給其他線程讀取,這些信息包括:線程上下文信息,對(duì)象的內(nèi)部指針等。

而 Stop the World 就是所有線程同時(shí)進(jìn)入 Safe Point 并停留在那里,等待 JVM 進(jìn)行內(nèi)存分析掃描,接著進(jìn)行內(nèi)存垃圾回收的時(shí)間。

為啥需要 Safe Point

前面我們說(shuō)到,Safe Point 其實(shí)就是一個(gè)代碼的特殊位置,在這個(gè)位置時(shí)線程可以暫停下來(lái)。而當(dāng)我們進(jìn)行 GC 的時(shí)候,所有線程都要進(jìn)入到 Safe Point 處,才可以進(jìn)行內(nèi)存的分析及垃圾回收。根據(jù)這個(gè)過(guò)程,其實(shí)我們可以看到:Safe Point 其實(shí)就是柵欄的作用,讓所有線程停下來(lái),否則如果所有線程都在運(yùn)行的話,JVM 無(wú)法進(jìn)行對(duì)象引用的分析,那么也無(wú)法進(jìn)行垃圾回收了。

此外,另一個(gè)重要的 Java 線程特性 —— interrupted 也是根據(jù) Safe Point 實(shí)現(xiàn)的。當(dāng)我們?cè)诖a里寫入 Thread.interrupt() 時(shí),只有線程運(yùn)行到 Safe Point 處時(shí)才知道是否發(fā)生了 interrupted。因此,Safe Point 也承擔(dān)了存儲(chǔ)線程通信的功能。

總結(jié)

簡(jiǎn)單地說(shuō),Safe Point 就是人為規(guī)定出的一些代碼位置,在這些位置上線程可以暫停下來(lái),從而讓 JVM 可以進(jìn)行內(nèi)存對(duì)象引用分析等操作。此外,Safe Point 處也會(huì)存儲(chǔ)一些特殊的信息,從而支持 Java 的某些特性,例如:Java 的 interrupt 特性需要到 Safe Point 處才能知道。

其實(shí)關(guān)于 Safe Point 的內(nèi)容還有不少,例如:

什么地方會(huì)放 Safe Point?Safe Point 具體是怎么實(shí)現(xiàn)的?什么情況會(huì)讓所有線程進(jìn)入 Safe Point?

但對(duì)于大多數(shù)應(yīng)用開(kāi)發(fā)人員來(lái)說(shuō),其實(shí)暫時(shí)不需要了解得這么深,只需要知道啥是 Safe Point 以及其存在的價(jià)值即可。如果你對(duì)這些問(wèn)題感興趣,可以通過(guò)參考資料部分詳細(xì)了解。

參考資料

JVM 相關(guān) - SafePoint 與 Stop The World 全解

JVM源碼分析之安全點(diǎn)safepoint - 簡(jiǎn)書(shū)

JVM垃圾回收安全點(diǎn)Safe Point

GC安全點(diǎn)(Safepoint)

  • 程序執(zhí)行時(shí)并非在所有地方都能停頓下來(lái)開(kāi)始GC,只有在特定的位置才能停頓下來(lái)開(kāi)始GC,這些位置稱為“安全點(diǎn)(Safepoint) ”
  • Safe Point的選擇很重要,如果太少可能導(dǎo)致GC等待的時(shí)間太長(zhǎng),如果太頻繁可能導(dǎo)致運(yùn)行時(shí)的性能問(wèn)題。大部分指令的執(zhí)行時(shí)間都非常短暫,通常會(huì)根據(jù)“是否具有讓程序長(zhǎng)時(shí)間執(zhí)行的特征”為標(biāo)準(zhǔn)。比如:選擇些執(zhí)行時(shí)間較長(zhǎng)的指令作為Safe Point, 如方法調(diào)用、循環(huán)跳轉(zhuǎn)和異常跳轉(zhuǎn)等。

如何在GC發(fā)生時(shí),檢查所有線程都跑到最近的安全點(diǎn)停頓下來(lái)呢?

  • 搶先式中斷: (目前沒(méi)有虛擬機(jī)采用了) 首先中斷所有線程。如果還有線程不在安全點(diǎn),就恢復(fù)線程,讓線程跑到安全點(diǎn)。
  • 主動(dòng)式中斷: 設(shè)置一個(gè)中斷標(biāo)志,各個(gè)線程運(yùn)行到Safe Point的時(shí)候主動(dòng)輪詢這個(gè)標(biāo)志,如果中斷標(biāo)志為真,則將自己進(jìn)行中斷掛起。

安全區(qū)域(Safe Region)

Safepoint機(jī)制保證了程序執(zhí)行時(shí),在不太長(zhǎng)的時(shí)間內(nèi)就會(huì)遇到可進(jìn)入GC的Safepoint

但是,程序“不執(zhí)行”的時(shí)候呢?例如線程處于Sleep 狀態(tài)或Blocked狀態(tài),這時(shí)候線程無(wú)法響應(yīng)JVM的中斷請(qǐng)求,“走” 到安全點(diǎn)去中斷掛起,JVM也不太可能等待線程被喚醒。對(duì)于這種情況,就需要安全區(qū)域(Safe Region)來(lái)解決。

安全區(qū)域是指在一段代碼片段中,對(duì)象的引用關(guān)系不會(huì)發(fā)生變化,在這個(gè)區(qū)域中的任何位置開(kāi)始GC都是安全的。我們也可以把Safe Region 看做是被擴(kuò)展了的Safepoint。

程序?qū)嶋H執(zhí)行時(shí):

  • 1、當(dāng)用戶線程運(yùn)行到Safe Region的代碼時(shí),首先標(biāo)識(shí)已經(jīng)進(jìn)入了Safe Region,如果這段時(shí)間內(nèi)發(fā)生GC,JVM會(huì)忽略標(biāo)識(shí)為Safe Region狀態(tài)的用戶線程即用戶線程STW,等待JVM執(zhí)行GC完畢;
  • 2、當(dāng)用戶線程即將離開(kāi)Safe Region時(shí), 會(huì)檢查JVM是否已經(jīng)完成GC,如果完成了,則用戶線程繼續(xù)運(yùn)行,否則用戶線程必須等待直到收到可以安全離開(kāi)SafeRegion的信號(hào)為止;

到此這篇關(guān)于一文講清楚 JVM Safe Point的文章就介紹到這了,更多相關(guān)JVM Safe Point內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java compareTo和compare方法比較詳解

    java compareTo和compare方法比較詳解

    這篇文章主要介紹了java compareTo和compare方法比較詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 詳解關(guān)于springboot-actuator監(jiān)控的401無(wú)權(quán)限訪問(wèn)

    詳解關(guān)于springboot-actuator監(jiān)控的401無(wú)權(quán)限訪問(wèn)

    本篇文章主要介紹了詳解關(guān)于springboot-actuator監(jiān)控的401無(wú)權(quán)限訪問(wèn),非常具有實(shí)用價(jià)值,有興趣的可以了解一下
    2017-09-09
  • Java多線程中的Phaser詳解

    Java多線程中的Phaser詳解

    這篇文章主要介紹了Java多線程中的Phaser詳解,Pahser是一個(gè)可以重復(fù)使用的同步屏障,Phaser是按照不同階段執(zhí)行線程的,它本身維護(hù)著一個(gè)叫 phase 的成員變量代表當(dāng)前執(zhí)行的階段,需要的朋友可以參考下
    2023-11-11
  • Java實(shí)現(xiàn)簡(jiǎn)單的掃雷圖

    Java實(shí)現(xiàn)簡(jiǎn)單的掃雷圖

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的掃雷圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Java編程WeakHashMap實(shí)例解析

    Java編程WeakHashMap實(shí)例解析

    這篇文章主要介紹了Java編程WeakHashMap實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • java中的Arrays這個(gè)工具類你真的會(huì)用嗎(一文秒懂)

    java中的Arrays這個(gè)工具類你真的會(huì)用嗎(一文秒懂)

    這篇文章主要介紹了java中的Arrays這個(gè)工具類你真的會(huì)用嗎,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 簡(jiǎn)單聊一聊Spring中Bean別名的處理原理

    簡(jiǎn)單聊一聊Spring中Bean別名的處理原理

    今天來(lái)和小伙伴們聊一聊 Spring 中關(guān)于 Bean 別名的處理邏輯,別名,顧名思義就是給一個(gè) Bean 去兩個(gè)甚至多個(gè)名字,整體上來(lái)說(shuō),在 Spring 中,有兩種不同的別名定義方式,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2023-09-09
  • Jmeter的接口測(cè)試詳細(xì)步驟并實(shí)現(xiàn)業(yè)務(wù)閉環(huán)

    Jmeter的接口測(cè)試詳細(xì)步驟并實(shí)現(xiàn)業(yè)務(wù)閉環(huán)

    這篇文章主要介紹了Jmeter的接口測(cè)試詳細(xì)步驟并實(shí)現(xiàn)業(yè)務(wù)閉環(huán),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Spring?Boot?整合JPA?數(shù)據(jù)模型關(guān)聯(lián)使用操作(一對(duì)一、一對(duì)多、多對(duì)多)

    Spring?Boot?整合JPA?數(shù)據(jù)模型關(guān)聯(lián)使用操作(一對(duì)一、一對(duì)多、多對(duì)多)

    這篇文章主要介紹了Spring?Boot?整合JPA?數(shù)據(jù)模型關(guān)聯(lián)操作(一對(duì)一、一對(duì)多、多對(duì)多),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Springboot 如何關(guān)閉自動(dòng)配置

    Springboot 如何關(guān)閉自動(dòng)配置

    這篇文章主要介紹了Springboot 如何關(guān)閉自動(dòng)配置的操作,具有很好的開(kāi)車價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論