色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

JVM入門之關于GC的擴展知識2

jf_78858299 ? 來源:北洋洋洋 ? 作者:北洋 ? 2023-02-10 11:35 ? 次閱讀

5.一個"小Bug":線程如果不執行呢?

上面說到過現在虛擬機采用的幾乎都是主動式中斷來中斷線程,而其實現又是通過 「線程執行過程中不斷輪詢標志位」 產生自陷異常信號在異常處理表中進行中斷線程,

大家有沒有發現有個小bug:如果我輪詢的操作一直得不到執行呢?這個時候我又該如何讓虛擬機進入垃圾回收狀態。

其實不一定都需要進行中斷線程來保證,回想下STW是為什么:因為如果這個時候用戶線程還在執行的話內存中的引用關系可能會發生變化,所以才需要進行STW。如果一個線程沒有得到CPU時間片執行(java中的線程對應于操作系統的線程,對應關系也可以找筆者之前的關于SignCatcher對線程的理解進行查閱),但是我可以確保其中一部分代碼區域是不會改變內存引用關系的,這樣也可以不用管這些線程。

引入Safe Region(安全區域)解決

?

“安全區域:這部分代碼不會使內存中的引用關系發生變化”,因此只要進入了安全區域,虛擬機就不會管這些線程。當線程離開安全區域后,如果這個時候引用鏈還沒有形成(也就是通過GC Roots遍歷堆內存)那么是不能離開的,一直等待直至引用鏈形成(或者完成了垃圾回收器需要暫停用戶線程的階段)收到信號為止。

?

6. GC Roots會隨著運行時間變長而增加嗎?

基礎知識介紹

根據堆中的不同區域(分代設計)和回收內存空間來判定分為不同的GC名稱:局部回收:Minor GC,MajorGC,..... 整個內存回收:Full GC

如果存在“跨代引用”(最典型的比如老年代對象引用年輕代對象),比如發生Minor GC時,只遍歷普通的GC Roots對象其實結果并不準確( 「某些對象雖然本身不屬于GC Roots但是隨著經歷的GC次數變多成為老年代對象」 ),如果這個時候將這個引用的年輕代對象標記為垃圾清除后,老年代中的對象就會有問題,所以引用鏈形成的過程中還需要 「遍歷整個老年代來保證結果準確」

CPU的緩存行技術及偽共享解決方案

!

記憶集

跨域可以理解為跨內存訪問或者訪問其他分代里面的內存

上面遍歷整個老年代這個過程聽起來就很耗時哈哈,事實也確實如此。那么我們可以引入這么一個概念:如果你引用了其他內存里面的對象那么我把你存放到其他內存里面的一個數據結構里面,之后其他內存回收的時候只需要把之前添加到數據結構里面的對象加入到GC Roots中即可。

我們優化一下: 「每個不同的分代中都存著一個數組」 ,這個數組中對堆內存進行一個映射, 我數組中的每一小塊對應的元素是分代中固定大小的內存(比如我第一個數組下標表示我引用的是0到100,第二個數組下標表示引用的是100-200以此類推)。 「當我第一個數組下標對應內存跨域引用了其他分代中的內存,我將把第一個數組下標對應的內存的元素值標識為1代表臟(Dirty)」 ,沒有則為0。當垃圾回收時,我就知道哪部分內存是跨代引用并將他們加入到GC Roots進行掃描(將數組中元素為1對應的內存對象加入GC Roots中)。

根據我映射的內存大小精度又可以進行細分:1.字長精度:只記錄一個機器字長(處理器的尋址位數)該字包含跨代指針

2.對象精度:記錄一個對象(對象字段中含有跨代指針)

3.卡精度:記錄一塊內存區域(該區域有對象包含跨代指針)

最常用的精度

采用“卡精度”的記憶集是通過“卡表”這個數據結構來實現的。

使用精度為卡,這個記憶集的實現方式也被稱為 「卡表」 ,卡表中其實是字節數組結構,每個數組中的元素都對應一部分指定大小內存塊,這部分內存被稱作 「卡頁」 ,當卡頁中的內存塊中引用了其他的內存塊中的一個或多個對象,就會將卡頁中的元素值變為一。變為一的就是臟數據,收集時講這部分內存加入到gc roots中。也就是這樣的:

可能出現的問題

一, 「何時進行更新卡表?」 先看我這張圖哈哈,字不好看,但是大致意思是差不多的。

?

我在寫后屏障中進行更新卡表就可以保證我的卡表記錄是正確的。

?

二, 「“偽共享引起的問題”」 上面剛剛講過CPU的緩存行技術,簡單來說就是如果兩個線程中兩個獨立的變量在同一塊緩存行中,那么不管是哪個線程修改,另外一個線程都需要重新從主存中讀取,而設置緩存行就是為了加快讀取效率,所以這樣勢必會降低效率。

想想剛剛我們記憶集處理方式,如果卡頁對應的內存中發生跨代引用,那么就會對卡表進行更新;上面說的“偽共享”也會在這里出現而且影響性能,比如: 「一個緩存行六十四個字節;一個卡表中的一個元素是一個字節,每個元素對應的一個卡頁存儲的是512字節,也就是一個卡表中64個元素在一個緩存行,而這64個元素對應的總卡頁內存為32KB(64 X 512字節)」 ,如果兩個線程中的變量分配到了這部分內存中,之后變量發生跨代引用更新卡表元素時就會導致另一個線程的緩存行失效而從主存中去拿。所以應該減少更新卡表這個操作,如果已經更新過臟數據了就不需要進行更新卡表了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編程
    +關注

    關注

    88

    文章

    3637

    瀏覽量

    93911
  • GC
    GC
    +關注

    關注

    0

    文章

    9

    瀏覽量

    17097
  • JVM
    JVM
    +關注

    關注

    0

    文章

    158

    瀏覽量

    12252
收藏 人收藏

    評論

    相關推薦

    電子技術入門維修基礎知識

    電子技術入門維修基礎知識
    發表于 08-17 20:03

    請問單例對象會被jvmgc時回收嗎?

    單例對象會被jvmgc時回收嗎?
    發表于 11-09 07:02

    JVM知識點匯總,不看肯定后悔

    JVM知識點匯總,不看肯定后悔
    發表于 11-30 06:13

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

    查詢很多參數的默認值;該命令還可以在運行時動態調整部分參數,只是很少被使用;3、jstat命令jstat :以指定的頻率輸出JVM的監控指標,下述命令輸出內存占用和GC相關信息,每隔3秒輸出一次,連續
    發表于 11-16 15:30

    Java:JVM虛擬機的入門知識

    Java開發現在面試越來越難了,進大廠必備的JVM、多線程高并發這都是最基礎的知識了,今天我們一起來學習Java虛擬機入門
    的頭像 發表于 07-01 11:43 ?2343次閱讀
    Java:<b class='flag-5'>JVM</b>虛擬機的<b class='flag-5'>入門</b><b class='flag-5'>知識</b>

    如何解決JVM解釋器導致應用崩潰的bug

    bug 導致在弱內存模型的平臺上 Crash。 在分析過程中,涉及到非常多的 JVM 內部知識,比如對象頭、GC 復制算法操作、CAS 操作、字節碼執行、內存序等,希望對讀者有所幫助。本文介紹了一般分析
    的頭像 發表于 08-27 09:58 ?2475次閱讀
    如何解決<b class='flag-5'>JVM</b>解釋器導致應用崩潰的bug

    關于JVM的調優知識

    最近很多小伙伴跟我說,自己學了不少JVM的調優知識,但是在實際工作中卻不知道何時對JVM進行調優。今天,我就為大家介紹幾種JVM調優的場景。
    的頭像 發表于 09-14 14:54 ?873次閱讀

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

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

    JVM入門歷代垃圾回收器 1

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

    JVM入門歷代垃圾回收器 2

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

    JVM入門關于GC擴展知識1

    本章主要是對上一篇文章講的垃圾回收機制的擴展,垃圾回收其實本身是有很多可以優化的點的,本章就進行對這些優化點進行介紹。
    的頭像 發表于 02-10 11:35 ?573次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b><b class='flag-5'>關于</b><b class='flag-5'>GC</b>的<b class='flag-5'>擴展</b><b class='flag-5'>知識</b>1

    JVM入門垃圾回收算法

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

    JVM的一些重要參數

    ,默認GC 是G1 GC算法。Java 17 默認也是G1 GC,其中個別版本會有點差異。 下面是常用GC算法使用命令。 GC Algor
    的頭像 發表于 09-25 15:56 ?500次閱讀

    JVM知識體系剖析

    從源碼到運行、類加載,再到內存分配和垃圾回收,以及JVM調優的技巧與實戰。 理論-實戰-面試三結合,帶大家剖析整個JVM知識體系,一站解決JVM問題。 1、Oracle Java SE
    的頭像 發表于 10-10 11:37 ?456次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>知識</b>體系剖析

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

    更好地優化自己的代碼,并解決一些潛在的性能問題。 本文及后續文章將從原理聊起,對JVM的內存分配、GC、編譯等知識進行分析和總結。 1 JVM運行時內存劃分 1.1 運行時數據區域 ?
    的頭像 發表于 08-20 15:25 ?274次閱讀
    從原理聊<b class='flag-5'>JVM</b>(一):染色標記和垃圾回收算法
    主站蜘蛛池模板: bl高h乱肉辣文 | 暖暖视频中国在线观看免费韩国 | 好男人视频免费高清在线观看www | 国产在线亚洲精品观看不卡 | 国产精选视频在线观看 | 日日碰狠狠添天天爽 | 国产精品搬运 | 最近更新2019中文字幕国语 | 99re6热这里在线精品视频 | 国产精品午夜小视频观看 | 亚洲欧美中文字幕网站大全 | 漂亮美女2018完整版 | 欧美精品专区免费观看 | 蜜桃AV色欲A片精品一区 | 幻女FREE性俄罗斯学生 | 十分钟免费视频大全在线观看 | 久久久免费热线精品频 | chinesedaddy80老年人 | 他揉捏她两乳不停呻吟口述 | 芒果影院网站在线观看 | 全是肉的高h短篇列车 | 日日AV夜夜添久久奶无码 | 性西欧俄罗斯极品 | 国产产乱码一二三区别免费 | 国产传媒18精品A片在线观看 | 日韩毛片大全 | 日本午夜精品理论片A级APP发布 | 国产 交换 丝雨 巅峰 | 8050午夜二级一片 | 国产在线观看网址你懂得 | 欧美精品成人久久网站 | 草莓视频在线播放视频 | 好硬好湿好爽再深一点视频 | 在线观看免费毛片 | 99久久亚洲精品影院 | 午夜一级免费视频 | 国内精品一级毛片免费看 | 果冻传媒在线完整免费播放 | 瑜伽牲交AV | 王晶三级作品 | 国产成人a在一区线观看高清 |