一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JVM入門之關(guān)于GC的擴(kuò)展知識(shí)1

jf_78858299 ? 來源:北洋洋洋 ? 作者:北洋 ? 2023-02-10 11:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本章主要是對(duì)上一篇文章講的垃圾回收機(jī)制的擴(kuò)展,垃圾回收其實(shí)本身是有很多可以優(yōu)化的點(diǎn)的,本章就進(jìn)行對(duì)這些優(yōu)化點(diǎn)進(jìn)行介紹。

1.GC Roots遍歷提升效率

以往做法

當(dāng)垃圾回收器線程進(jìn)行GC時(shí), 第一步需要 「找到GC Roots」 ;第二步通過GC Roots進(jìn)行 「遍歷堆中引用GC Roots的對(duì)象形成引用鏈」 ;第三步,將不在引用鏈中的對(duì)象標(biāo)記進(jìn)行 「標(biāo)記」 (需要回收的對(duì)象),或者 「標(biāo)記」 引用鏈中的對(duì)象(需要復(fù)制,整理的對(duì)象),具體標(biāo)記哪種對(duì)象根據(jù)堆中的分代內(nèi)存不同和采用的垃圾回收算法來確定。

可優(yōu)化地方以及優(yōu)化原理

上述過程第二步中遍歷堆中引用GC Roots的對(duì)象,這部分隨著堆內(nèi)存的越來越大需要的時(shí)間也會(huì)逐步增長。如果能夠提前知道堆中哪部分內(nèi)存是引用,來判斷是否引用GC Roots這樣效率是不是會(huì)更高一些。

沒錯(cuò),因?yàn)橹爸v過從Exact VM開始就已經(jīng)采用了準(zhǔn)確式內(nèi)存管理即知道哪部分內(nèi)存是引用;而且在即時(shí)編譯的過程中我也會(huì)知道棧中或者寄存器里哪部分內(nèi)存是引用。這個(gè)時(shí)候我用一個(gè)數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)這些信息,在第二步中就不需要遍歷整個(gè)堆了,只需要遍歷沒有標(biāo)識(shí)引用內(nèi)存的地方(也就是剛才數(shù)據(jù)結(jié)構(gòu)中沒有存儲(chǔ)的信息)。

在HotSpot中使用OopMap這個(gè)數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)這信息,也就是可以顯著提高GC Roots遍歷的效率,但是在什么位置放這些信息呢?

2.提升了GC Roots遍歷效率卻不知道怎么安插?

前面提到過通過一個(gè)OopMap數(shù)據(jù)結(jié)構(gòu)能夠提升遍歷效率,但是OopMap中的數(shù)據(jù)在不同的地方內(nèi)容是不一樣的(比如每個(gè)方法里面我的局部變量表里面的內(nèi)容可能是不一樣的),所以 我為每個(gè)指令附近都放一個(gè)OopMap 。

?

等等,這樣未免也太浪費(fèi)內(nèi)存了吧~。

?

沒錯(cuò),所以我們得先辦法把它放到合適的地方!嗯沒錯(cuò),我想想: **「這個(gè)數(shù)據(jù)結(jié)構(gòu)的出現(xiàn)是為了優(yōu)化GC第二步的效率出現(xiàn)的,也就是說只有GC時(shí)在放這些數(shù)據(jù)就行了~。思路找到了,但是什么時(shí)候發(fā)生GC呢?

發(fā)生GC這個(gè)時(shí)間我不能確定,但是我可以確定的是它遍歷堆中內(nèi)存的時(shí)候必須要進(jìn)行STW【否則如果在標(biāo)記的過程中堆中引用發(fā)生變化就會(huì)導(dǎo)致標(biāo)記結(jié)果出錯(cuò)】(2.1中講解),我指定只有代碼中執(zhí)行執(zhí)行到某個(gè)地方才可以進(jìn)行STW這樣我就可以間接的實(shí)現(xiàn)我的目的」** 。

也就是說當(dāng)GC發(fā)生時(shí),只有執(zhí)行到某個(gè)地方才會(huì)進(jìn)行STW,然后我在這個(gè)地方附近放上這么一個(gè)OopMap的數(shù)據(jù)結(jié)構(gòu),然后加快第二步的效率。

「這個(gè)某個(gè)地方其實(shí)名字叫做“safePoint”」 ,顧名思義安全點(diǎn),只有代碼執(zhí)行到安全點(diǎn)附近才可以進(jìn)行STW垃圾收集,而只要將OopMap安插到安全點(diǎn)附近就行。

2.1為什么需要STW?

上面提到過:

?

【否則如果在標(biāo)記的過程中堆中引用發(fā)生變化就會(huì)導(dǎo)致標(biāo)記結(jié)果出錯(cuò)】

?

一,三色標(biāo)記法

接下來用三色標(biāo)記法進(jìn)行解釋如果沒有STW會(huì)發(fā)生什么情況:一,先解釋三色標(biāo)記法:

二,沒有STW出現(xiàn)的情況

在這里插入圖片描述

三,解決方案

上面那種異常情況必須同時(shí)滿足兩個(gè)條件:1.灰色對(duì)象不引用白色對(duì)象 2.黑色讀寫引用白色對(duì)象

因此,只要讓其中一個(gè)條件不滿足即可,因此出現(xiàn)了兩種解決方案:1.增量更新:這種方案是讓第二個(gè)條件不滿足,即當(dāng)黑色對(duì)象引用白色對(duì)象時(shí),將這個(gè)黑色對(duì)象保存下來,等掃描結(jié)束后,再次取出黑色對(duì)象進(jìn)行掃描,可以簡單理解為如果黑色對(duì)象引用了百世對(duì)象就會(huì)被標(biāo)記為灰色。

2.原始快照:當(dāng)灰色對(duì)象刪除白色對(duì)象的引用時(shí),將這個(gè)灰色對(duì)象記錄下來,等到掃描結(jié)束后,在對(duì)這些灰色對(duì)象為根進(jìn)行掃描,簡單理解為:不管是否刪除與否都會(huì)按照第一次剛開始的引用關(guān)系圖進(jìn)行掃描。

?

CMS垃圾回收器采用增量更新來進(jìn)行并發(fā)標(biāo)記,G1,Shenandoah采用原始快照

?

3.safePoint我又該放到哪里?

safePoint上面解釋過了,但是我該在哪里放置safePoint呢?放的多了會(huì)導(dǎo)致GC收集過于頻繁增加運(yùn)行時(shí)內(nèi)存壓力,放的少了又會(huì)因?yàn)槎阎胁粩嘣黾邮褂玫膬?nèi)存而沒有及時(shí)回收堆里面內(nèi)存導(dǎo)致垃圾收集器等待時(shí)間過長。

這樣,我定義一個(gè)規(guī)則,只有這種**“會(huì)讓程序長時(shí)間運(yùn)行的指令”**特征我才會(huì)進(jìn)行安插safePoint,但是這個(gè)特征“長時(shí)間”并沒有具體的定義,但是卻有“指令序列復(fù)用”這樣的含義。比如方法調(diào)用,循環(huán)調(diào)整,異常跳轉(zhuǎn)這些,只有這些指令附近才會(huì)安插safePoint。

safePoint位置選好了,但是上個(gè)問題說過執(zhí)行到safePoint中需要進(jìn)行STW,發(fā)生GC時(shí),我該如何快速跑到safePoint附近進(jìn)行STW?還有我這個(gè)STW該怎么實(shí)現(xiàn)呢?

4.如何實(shí)現(xiàn)STW?

首先解釋為什么叫做STW,全稱“Stop the Word”,因?yàn)?「通過GC Roots遍歷堆中內(nèi)存的過程其內(nèi)存里面的引用關(guān)系不能發(fā)生變化」 ,所以需要暫停所有的用戶線程操作來保障Gc Roots形成的引用鏈?zhǔn)钦_的即待會(huì)標(biāo)記過程不會(huì)出錯(cuò)。

讓所有線程都暫停,這個(gè)“看起來復(fù)雜其實(shí)并不簡單”的操作其實(shí)有兩種方式處理:一,搶先式中斷:

?

垃圾收集器收集時(shí),系統(tǒng)將所有用戶線程都中斷。當(dāng)發(fā)現(xiàn)不在safePoint附近的線程時(shí)先讓他恢復(fù)運(yùn)行直至跑到safePoint附近。這種方式現(xiàn)在幾乎沒有虛擬機(jī)采用這種方式來響應(yīng)GC。

?

二,主動(dòng)式中斷:

?

我不直接對(duì)我的用戶線程操作,當(dāng)發(fā)生GC時(shí),我給用戶線程設(shè)立個(gè)標(biāo)志位,用戶線程執(zhí)行的時(shí)候不斷輪詢這個(gè)標(biāo)志位,如果輪詢到了那么我將自己中斷我自己的運(yùn)行,由于這種方式是輪詢到就立馬進(jìn)行掛起所以將輪詢的地方和safePoint的地方重合。

?

優(yōu)化

“不斷輪詢標(biāo)志位”這句話聽起來就很耗時(shí)哈哈,那么再虛擬機(jī)中是怎么優(yōu)化的呢?還有輪詢之后的操作我自己掛起我自己這個(gè)又是怎么實(shí)現(xiàn)的?

等等,我不放到下一個(gè)問題里面講了,直接一遍過:

輪詢標(biāo)志位這個(gè)操作其實(shí)就是一條匯編指令,(對(duì)于匯編和JAVA是什么關(guān)系,之前也有講到過,辛苦翻閱前面文章~) 這條匯編指令的意思就是當(dāng)我輪詢到需要中斷線程的標(biāo)志位的時(shí)候:我會(huì)將其中一個(gè)內(nèi)存頁設(shè)置為不可讀,這會(huì)導(dǎo)致產(chǎn)生一個(gè)自陷異常信號(hào),異常處理器中接受到后進(jìn)行主動(dòng)中斷操作。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3689

    瀏覽量

    95151
  • GC
    GC
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    17197
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    160

    瀏覽量

    12605
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    電子技術(shù)入門維修基礎(chǔ)知識(shí)

    電子技術(shù)入門維修基礎(chǔ)知識(shí)
    發(fā)表于 08-17 20:03

    請問單例對(duì)象會(huì)被jvmgc時(shí)回收嗎?

    單例對(duì)象會(huì)被jvmgc時(shí)回收嗎?
    發(fā)表于 11-09 07:02

    JVM知識(shí)點(diǎn)匯總,不看肯定后悔

    JVM知識(shí)點(diǎn)匯總,不看肯定后悔
    發(fā)表于 11-30 06:13

    看看基于JDK中自帶JVM工具的用法

    用到命令,下面圍繞一個(gè)微服務(wù)的啟動(dòng)和運(yùn)行,來看看基于JDK中自帶JVM工具的用法;三、命令行工具1、jps命令jps :虛擬機(jī)進(jìn)程狀態(tài)工具,該命令在Java環(huán)境部署和服務(wù)啟動(dòng)查看時(shí)經(jīng)常用到,首先在本地
    發(fā)表于 11-16 15:30

    Java:JVM虛擬機(jī)的入門知識(shí)

    Java開發(fā)現(xiàn)在面試越來越難了,進(jìn)大廠必備的JVM、多線程高并發(fā)這都是最基礎(chǔ)的知識(shí)了,今天我們一起來學(xué)習(xí)Java虛擬機(jī)入門
    的頭像 發(fā)表于 07-01 11:43 ?2507次閱讀
    Java:<b class='flag-5'>JVM</b>虛擬機(jī)的<b class='flag-5'>入門</b><b class='flag-5'>知識(shí)</b>

    如何解決JVM解釋器導(dǎo)致應(yīng)用崩潰的bug

    bug 導(dǎo)致在弱內(nèi)存模型的平臺(tái)上 Crash。 在分析過程中,涉及到非常多的 JVM 內(nèi)部知識(shí),比如對(duì)象頭、GC 復(fù)制算法操作、CAS 操作、字節(jié)碼執(zhí)行、內(nèi)存序等,希望對(duì)讀者有所幫助。本文介紹了一般分析
    的頭像 發(fā)表于 08-27 09:58 ?2699次閱讀
    如何解決<b class='flag-5'>JVM</b>解釋器導(dǎo)致應(yīng)用崩潰的bug

    關(guān)于JVM的調(diào)優(yōu)知識(shí)

    最近很多小伙伴跟我說,自己學(xué)了不少JVM的調(diào)優(yōu)知識(shí),但是在實(shí)際工作中卻不知道何時(shí)對(duì)JVM進(jìn)行調(diào)優(yōu)。今天,我就為大家介紹幾種JVM調(diào)優(yōu)的場景。
    的頭像 發(fā)表于 09-14 14:54 ?1051次閱讀

    一次JVM GC長暫停的排查過程

    在高并發(fā)下,Java 程序的 GC 問題屬于很典型的一類問題,帶來的影響往往會(huì)被進(jìn)一步放大。不管是「GC 頻率過快」還是「GC 耗時(shí)太長」,由于 GC 期間都存在 Stop The W
    的頭像 發(fā)表于 01-17 10:08 ?894次閱讀

    JVM入門歷代垃圾回收器 1

    很多人經(jīng)常把這兩個(gè)搞混,當(dāng)然筆者剛開始的時(shí)候也是傻傻分不清楚。其實(shí)只要記住并行說的是GC 線程之間的關(guān)系,而并發(fā)說的是GC和用戶線程之間的關(guān)系
    的頭像 發(fā)表于 02-10 11:29 ?857次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b>歷代垃圾回收器 <b class='flag-5'>1</b>

    JVM入門歷代垃圾回收器 2

    很多人經(jīng)常把這兩個(gè)搞混,當(dāng)然筆者剛開始的時(shí)候也是傻傻分不清楚。其實(shí)只要記住并行說的是GC 線程之間的關(guān)系,而并發(fā)說的是GC和用戶線程之間的關(guān)系
    的頭像 發(fā)表于 02-10 11:29 ?767次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b>歷代垃圾回收器 2

    JVM入門關(guān)于GC擴(kuò)展知識(shí)2

    本章主要是對(duì)上一篇文章講的垃圾回收機(jī)制的擴(kuò)展,垃圾回收其實(shí)本身是有很多可以優(yōu)化的點(diǎn)的,本章就進(jìn)行對(duì)這些優(yōu)化點(diǎn)進(jìn)行介紹。
    的頭像 發(fā)表于 02-10 11:35 ?722次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b><b class='flag-5'>關(guān)于</b><b class='flag-5'>GC</b>的<b class='flag-5'>擴(kuò)展</b><b class='flag-5'>知識(shí)</b>2

    JVM入門垃圾回收算法

    根據(jù)如何判定對(duì)象是垃圾,垃圾回收算法分為兩類:1、 「引用計(jì)數(shù)式垃圾收集」 (判定垃圾是通過引用計(jì)數(shù)器)別名:直接垃圾收集 2、 「追蹤式垃圾收集」 (判定垃圾是通過GC Roots)別名:間接垃圾收集
    的頭像 發(fā)表于 02-10 11:40 ?1048次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b>垃圾回收算法

    JVM的一些重要參數(shù)

    ,默認(rèn)GC 是G1 GC算法。Java 17 默認(rèn)也是G1 GC,其中個(gè)別版本會(huì)有點(diǎn)差異。 下面是常用
    的頭像 發(fā)表于 09-25 15:56 ?725次閱讀

    JVM知識(shí)體系剖析

    從源碼到運(yùn)行、類加載,再到內(nèi)存分配和垃圾回收,以及JVM調(diào)優(yōu)的技巧與實(shí)戰(zhàn)。 理論-實(shí)戰(zhàn)-面試三結(jié)合,帶大家剖析整個(gè)JVM知識(shí)體系,一站解決JVM問題。
    的頭像 發(fā)表于 10-10 11:37 ?639次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>知識(shí)</b>體系剖析

    從原理聊JVM(一):染色標(biāo)記和垃圾回收算法

    更好地優(yōu)化自己的代碼,并解決一些潛在的性能問題。 本文及后續(xù)文章將從原理聊起,對(duì)JVM的內(nèi)存分配、GC、編譯等知識(shí)進(jìn)行分析和總結(jié)。 1 JVM
    的頭像 發(fā)表于 08-20 15:25 ?502次閱讀
    從原理聊<b class='flag-5'>JVM</b>(一):染色標(biāo)記和垃圾回收算法