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

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

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

大家好,我是樹哥。

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

什么是 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 處停留下來,等到所有線程都停在 Safe Point 處時(shí),就可以進(jìn)行內(nèi)存引用分析,從而確定哪些對象是存活的、哪些對象是不存活的。

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

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

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

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

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

為啥需要 Safe Point

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

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

總結(jié)

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

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

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

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

參考資料

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

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

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

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

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

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

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

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

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

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

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

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

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

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

您可能感興趣的文章:

相關(guān)文章

  • SpringBoot使用jasypt加解密密碼的實(shí)現(xiàn)方法

    SpringBoot使用jasypt加解密密碼的實(shí)現(xiàn)方法

    這篇文章主要介紹了SpringBoot使用jasypt加解密密碼的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 使用Java實(shí)現(xiàn)Excel導(dǎo)入并進(jìn)行數(shù)據(jù)校驗(yàn)

    使用Java實(shí)現(xiàn)Excel導(dǎo)入并進(jìn)行數(shù)據(jù)校驗(yàn)

    這篇文章主要為大家詳細(xì)介紹了Java如何根據(jù)下載的指定數(shù)據(jù)模板寫入數(shù)據(jù)和導(dǎo)入并進(jìn)行數(shù)據(jù)校驗(yàn),文中的示例代碼講解詳細(xì),需要的可以了解下
    2025-03-03
  • 詳解log4j-over-slf4j與slf4j-log4j12共存stack overflow異常分析

    詳解log4j-over-slf4j與slf4j-log4j12共存stack overflow異常分析

    這篇文章主要介紹了詳解log4j-over-slf4j與slf4j-log4j12共存stack overflow異常分析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • SpringBoot下無節(jié)制和數(shù)據(jù)庫建立連接的問題及解決方法

    SpringBoot下無節(jié)制和數(shù)據(jù)庫建立連接的問題及解決方法

    本文介紹了無節(jié)制建立MySQL連接的危害,包括數(shù)據(jù)庫服務(wù)端資源耗盡、應(yīng)用端性能劣化和監(jiān)控與運(yùn)維困境,提出了系統(tǒng)性解決方案,包括連接池標(biāo)準(zhǔn)化配置、代碼規(guī)范與防御式編程、全鏈路監(jiān)控體系和架構(gòu)級優(yōu)化,感興趣的朋友一起看看吧
    2025-03-03
  • Java設(shè)計(jì)模式之單例設(shè)計(jì)模式解析

    Java設(shè)計(jì)模式之單例設(shè)計(jì)模式解析

    這篇文章主要介紹了Java設(shè)計(jì)模式之單例設(shè)計(jì)模式解析,設(shè)計(jì)模式是在大量的實(shí)踐中總結(jié)和理論化之后優(yōu)選的代碼結(jié)構(gòu)、編程風(fēng)格、以及解決問題的思考方式,設(shè)計(jì)模式免去我們自己再思考和摸索,需要的朋友可以參考下
    2023-11-11
  • Java由淺入深細(xì)數(shù)數(shù)組的操作下

    Java由淺入深細(xì)數(shù)數(shù)組的操作下

    數(shù)組對于每一門編程語言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語言對數(shù)組的實(shí)現(xiàn)及處理也不盡相同。Java?語言中提供的數(shù)組是用來存儲固定大小的同類型元素
    2022-04-04
  • maven解決包沖突方法詳解

    maven解決包沖突方法詳解

    這篇文章主要介紹了maven解決包沖突方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • java解壓zip文件示例

    java解壓zip文件示例

    這篇文章主要介紹了java解壓zip文件示例,在獲得一個(gè)以Zip格式壓縮的文件之后,需要將其進(jìn)行解壓縮,還原成壓縮前的文件,下面是代碼示例
    2014-03-03
  • java調(diào)用opencv身份證號識別詳解

    java調(diào)用opencv身份證號識別詳解

    這篇文章主要為大家詳細(xì)介紹了java如何調(diào)用opencv實(shí)現(xiàn)身份證號的識別,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Java中PageHelper分頁后對list操作導(dǎo)致分頁無效

    Java中PageHelper分頁后對list操作導(dǎo)致分頁無效

    在項(xiàng)目中使用分頁插件的時(shí)候發(fā)現(xiàn)PageHelper插件失效了,本文就來介紹一下Java中PageHelper分頁后對list操作導(dǎo)致分頁無效的解決方法,感興趣的可以了解一下
    2021-05-05

最新評論

广水市| 丽江市| 淮安市| 武夷山市| 台山市| 阳春市| 剑阁县| 安乡县| 阿拉善盟| 耒阳市| 沐川县| 乐陵市| 贵德县| 乌鲁木齐市| 拜城县| 从化市| 封丘县| 邳州市| 河西区| 靖远县| 新源县| 通江县| 磐安县| 易门县| 宽城| 吴忠市| 龙游县| 靖边县| 淅川县| 宁武县| 平南县| 封丘县| 汉川市| 临泽县| 凤山市| 东方市| 松潘县| 美姑县| 宿州市| 房山区| 巫山县|