亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

IBM Java如何做到高性能GC的實現內幕

2019-11-18 13:13:46
字體:
來源:轉載
供稿:網友

  IBM JVM的GC分為三個步驟,Mark phase(標記),Sweep phase(清掃),Compaction phase(內存緊縮). 在了解這些過程之前,我們先看一下IBMjava中的對象的Layout和Heap lay out 一個Java對象在IBM vm中的結構如下
  1.size+flags
  2.mptr
  3.locknflags
  4.objectdata
  size+flags
    這是一個4byte的slot(32 平臺)。這個slot的主要功能就是描述對象的尺寸。由于IBMJava中的對象都是以8byte的倍數分配的,因此對象的尺寸其實就是真實尺寸/8存放在4byte的slot中。另外在這個slot的低三位是保留字段起到標記對象的作用。他們分別為 bit1:swapped bit,這個交換位被用于Compaction phase即內存緊縮階段使用。同時 這一位在標記堆棧溢出的時候(mark stack overflow)也被用于標記NotYetScanned狀態. bit2:dosed bit.這個位用于標示這個對象是否被某個堆?;蛘呒拇嫫鱮eference到了。
  
  假如這個標志被至位則這個對象就不能在當前的GC cycle中被刪除。而且假如某個reference指向的內存不是一個真實的reference比如是一個簡單的float 或者integer變量但是它的值恰巧就是Heap中某個Object的地址的時候,我們就不能修改這個refernece。這種對象的bit2也被置為1。bit3:pinned bit。標記一個對象是否是一個一個釘扣對象(PINNED object)。一個Pinned Object也不能被GC刪除,因為他們可能在Heap之外被reference到了。典型的一個例子就是Thread,還記得我上面說的僵死縣城么?它不能被刪除的道理就是這個。另外一種PinnedObject就是 JNI Object,即被本地代碼使用的對象。
  
  Mptr:
  在32平臺上也是4byte的slot。Mptr有兩個功能,
  1。假如mptr不是一個數組,則Mptr指向一個方法塊(method block),你可以通過這個method block來得到一個類塊(class block)。這個類塊,告訴你這個Object是屬于哪個class的實例。method block和class block由Class Loader分配,而不是heap在heap中進行分配
  2。假如mptr是一個數組(Array),mptr包含了這個對象中,數組的元素個數。 lockflags
  在32平臺上也是4byte的slot,但是這個slot只有低4位被用到。
  bit2:是array flag.假如這個位被置位,那么這個對象就是一個數組同時mptr字段就包含了數組的元素個數。
  bit4是hashed和moved bit.假如這個位被置位,那么他就告訴我們這個對象在被hashed以后被刪除了。
  Object Data:
  就是這個對象本身的數據
  
  Heap layout:
   heap top
   heap limit
   heap base
  
  heap base是heap的起始地址,heap top是heap的結束地址。heaplimit 是當前程序使用的那段heap可以進行擴展和收縮的極限。你可以用-Xmx參數在java運行的時候對heap top和heap base進行控制。
  Alloc bits 和 mark bits
    
   heap top allocmax markemax
   heap limit alloc size marksize
   heap base
  上面這個結構描述了heap和alloc bits 以及,markbits之間的關系。allocbits和markbits都是元素為1個bit的vector。他們與heap有同樣的長度,下面是兩個對象被分配以后在heap和兩個vector中的表現
  heaptop allocmax markmax
  
  heaplimit allocsize marksize
  
  object2top
  .
  .
  object2base object2allocbit object2markbit
  
  object1top
  .
  object1base object1allocbit
  
  如上面的結構,假如一個對象在heap被alloc出來,那么在allocbits中就標示出這個對象的起始地址所在的地址。allocbits中只標記起始地址。但是這個過程告訴我們這個對象在那里被創建,但是不告訴我們這個對象是否存活。當在mark phase中假如某一個對象比如object2仍然存活,那么就在markbits中對應的地址上標記一下The free list
  
  IBM jvm中的空閑塊用用一個free list鏈標示。如圖
  
  freechunck1 freechunck2 freechunckn
  size size size
  next------------->next--->.........next--->NULL
  freeStorage freeStorage freestorge
  有了這些基本概念我們來看看Mark phase的工作情況
  
  MarkPhase
  GC的Mark phase將標記所有還活著的對象。這個標記所有可達對象的過程稱為tracing。Jvm的活動狀態(active state)是由下面幾個部分組成的。1.每個線程的保存寄存器(saved registers)2.描述線程的堆棧3.Java類中的靜態元素3.以及局部和全局的JNI(Java Native Interface)引用。在Jvm中的方法調用都在C Stack上引發一個Frame。這個Frame包含了,對象實例,為局部變量的assignment結果或者傳入方法的參數。所有這些引用在Tracing過程中都被同等對待。實際上,我們可以把一個線程的堆??闯且幌盗?-bytes slot的集合,然后對每一個堆棧都從頂向下對這些slot進行掃描。在掃描的過程中都必須校驗每個slot是否指向heap當中的一個真實的對象。因為在前面我就說過,很有可能這些slot值僅僅是一個int或float但是他們的值恰巧就等于heap中的一個對象地址。因此在掃描的時候必須相當的保守,掃描的時候必須保證所有的指針都是一個對象,而且這個對象沒有在GC中被刪除。只有符合下面條件的slot才是一個指向對象的指針。1.必須以8-byte的倍數分配的內存2.必須在heap的范圍之內(即大于heapbase小于heaptop)3.對應的allocbit必須置為1。滿足這些條件的對象引用我們稱為roots,并且把他們的dosed bit置為1表示不能被GC刪除。我想大家已經知道C#中為何連Int和Float都是OBject的原因了吧。在C#中因為都是OBject因此,在tracing的過程中就減少了一次校驗。這個減少對性能起到很大的影響。 假如掃描完成,那么Tracing過程便能安全精確的執行。也就是說我們可以在roots中通過reference找到他對應的objects,由于他們是真實的reference,那么我們就能夠在compactionphase中移動對應的對象并且修改這些reference。
  
  Trace過程使用了一個可以容納4k的slots的stack。所有的引用逐個push進入這個堆棧并且同時在markbits中進行標記。當push和mark的工作完成之后,我們開始pop出這些slot并且進行trace。
  
  常規的對象(非數組對象)將通過mptr去訪問classblock,classblock將會告訴我們從這個對象中找到的其他對象的reference在那里?當我們在classblock找到一個refernce以后,假如發現他沒有被mark,那么我們就在markallocbits中mark他然后把他再壓入堆棧。
  
  數組對象利用mptr去訪問每個數組元素,假如他們沒有mark則mark然后壓入堆棧。
  
  Trace過程一直持續進行,直到堆棧為空。
  
  MarkStack OverFlow
  
  由于markStack限制了尺寸,因此它可能會溢出。假如溢出發生,那么我們就設定一個全局的標志來表明發生了MarkStack OverFlow,然后我們將那些不能push入stack的OBject的bit1設定為NotYetScanned。然后當tracing過程完成以后,檢驗全局標志假如發現有overflow則把NotYetScanned的對象再次壓入堆棧開始新的tracing過程。
  
  并行Mark(Parallel Mark)
  
  由于使用逐位清掃(bitwise sweep)和內存緊縮規避功能,GC將化大部分的時間是用于Mark而非前面兩項。這就導致了IBM JVM需要開發一個GC的并行版本。并行GC的目的不是以犧牲單CPU系統上的效能來換取在4,8路對稱CPU系統上的高效率。
  
  并行Mark的基本思想就是通過多個輔助線程(helper thread)和一個共享工作的工具來減少Marking的時間。在單CPU系統中,執行GC工作的只有一個主線程。Parallel mark仍然需要這個主線程的參與,他充當了治理協調的角色。這個Thread所要執行的工作和單CPU上的一樣多,包括他必須掃描C-Stack來鑒別需要收集的roots指針。一個有N路對稱CPU的系統自動含有n-1個helper thread并且平均分布在每個CPU上,master thread將scan完的reference集合進行分塊,然后交給helper thread獨立完成mark工作。
  
  每個Helper thread都被分配了一個獨立的本地mark stack,以及一個shareable queue。sharqueue將存放help thread在mark overflow的時候的NotyetScanned對象。然后由master thread將sharequeue中的對象balance到其他已經空閑的thread上去。
  
  并發Mark(Concurrent mark)
  
  Concurrent mark的主要目的在于當heap增長的時候減少GC的pause time。只要heap到達heap limit的時候,Concurrent mark就會被執行。在Concurrent phase中,GC要求應用中的每個線程(不是指helper thread而是應用程序自己開啟的線程以便充分利用系統資源)掃描他們自己的堆棧來得到roots。然后使用這些roots來同步的trace 可達對象。Tracing工作是由一個后臺的低優先級的線程執行,同時程序自己開啟的線程在分配內存的時候必須執行heap lock allocation。
  
  由于使用程序自己開啟的線程并發的執行mark live objects,我們必須紀錄那些已經trace過的object的變化。這個功能是采用一個叫寫閘(write barrier) 來實現的。這個寫閘在每次改變引用的時候被激活。它告訴我們什么時候一個對象被跟新過了,以便我們從新掃描那部分heap。寫閘的具體實現是Heap會分配出512byte的內存段每個段都分配了一個byte在卡表中(card table)。無論何時一個對象的reference被更新cardtable將同步紀錄這個對象的起始地址。使用Byte而不用bit的原因是寫byte要比寫bit快2倍,而且我們可能希望空余的bit會在未來被用到。
  
  當Concurrent mark執行完畢以后,STW collection(stop total world)將會被執行。stw的意思是指suspend所有程序自己開啟的線程。因此我們可以看到假如使用Concurrent mark那

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美美最猛性xxxxxx| 午夜精品福利在线观看| 国产精品综合不卡av| 久久青草精品视频免费观看| 欧美日韩精品二区| 色婷婷av一区二区三区在线观看| 久久中文字幕国产| 91国产精品视频在线| 国产午夜精品视频免费不卡69堂| 亚洲二区在线播放视频| 日韩精品在线视频| 国产精品视频地址| 九九热这里只有精品免费看| 国产精品免费在线免费| xx视频.9999.com| 久久久久www| 亚洲最新视频在线| www.xxxx精品| 亚洲欧美日韩国产中文| 96pao国产成视频永久免费| 热门国产精品亚洲第一区在线| 欧美日韩中文字幕在线| 国产成人精品综合久久久| 国自产精品手机在线观看视频| 亚洲性日韩精品一区二区| 日韩欧美视频一区二区三区| 欧美精品免费看| 亚洲激情在线观看视频免费| 久久久99免费视频| 亚洲电影中文字幕| 欧美激情一区二区久久久| 97香蕉超级碰碰久久免费的优势| 日韩精品在线观| 91高清免费视频| 在线播放日韩专区| 国产精品偷伦一区二区| 欧美大片免费观看在线观看网站推荐| 欧美裸体xxxx极品少妇软件| 国产精品久久久久久超碰| 欧美另类交人妖| 亚洲人成电影网站色| 亚洲免费视频观看| 97久久伊人激情网| 亚洲国产成人久久综合| 国产美女久久精品香蕉69| 日韩av123| 日本高清视频一区| 97视频免费看| 久久久久国色av免费观看性色| 亚洲精品电影网在线观看| 这里只有精品视频| 成人免费视频xnxx.com| 国产视频亚洲精品| 亚洲天堂久久av| 伊人一区二区三区久久精品| 亚洲影院色在线观看免费| 精品福利一区二区| 久久久噜噜噜久噜久久| 国产色婷婷国产综合在线理论片a| 国产精品6699| 日韩精品免费在线视频观看| 欧美成人免费全部| 九九久久久久99精品| 欧美劲爆第一页| 亚洲男人av在线| 久久激情五月丁香伊人| 国产精品偷伦免费视频观看的| 成人网在线视频| 91精品国产高清| 欧美日韩一区二区免费在线观看| 久久精品亚洲94久久精品| 国产精品影片在线观看| 欧美高跟鞋交xxxxxhd| 亚洲精品国产精品久久清纯直播| 色青青草原桃花久久综合| 一本色道久久88综合日韩精品| 国产精品久久久久久av福利| 国产色综合天天综合网| 欧美极品少妇xxxxⅹ免费视频| 国产99久久精品一区二区永久免费| 国产视频精品久久久| 国产精品高清网站| 欧美精品免费播放| 欧美日在线观看| 欧美一区在线直播| 日韩av在线网址| 91精品国产高清自在线| 亚洲一级一级97网| 日日骚久久av| 精品国产精品三级精品av网址| 久久99久国产精品黄毛片入口| 精品国产91久久久久久老师| 综合激情国产一区| 成人黄色片在线| 欧美一区二区三区免费观看| 亚洲电影免费观看高清完整版| 亚洲精品日韩久久久| 日本久久久久久久| 欧美成人精品一区二区三区| 欧美高清不卡在线| 久久噜噜噜精品国产亚洲综合| 亚洲一区二区自拍| 91美女片黄在线观看游戏| 国内精品久久久久久中文字幕| 成人精品一区二区三区电影免费| 国产69精品久久久| 国产一区二区三区丝袜| 成人看片人aa| 亚洲第一区中文字幕| 日韩欧美aⅴ综合网站发布| 国产日韩中文在线| 555www成人网| 欧美激情a∨在线视频播放| 久久亚洲私人国产精品va| 欧美激情一区二区三区久久久| 欧美丝袜美女中出在线| 国产a∨精品一区二区三区不卡| 亚洲aⅴ日韩av电影在线观看| 亚洲视频自拍偷拍| 亚洲黄色成人网| 国产综合视频在线观看| 疯狂做受xxxx欧美肥白少妇| 欧美专区福利在线| 久久精品国产精品| 欧美精品电影在线| 最近2019中文字幕大全第二页| 亚洲国产美女久久久久| 欧美高跟鞋交xxxxxhd| 中文字幕在线看视频国产欧美在线看完整| 97香蕉超级碰碰久久免费软件| 欧美专区国产专区| 国产精品视频不卡| 热久久视久久精品18亚洲精品| 91精品国产综合久久香蕉922| 国产婷婷色综合av蜜臀av| 国产日韩av高清| 国产99久久久欧美黑人| 成人国产精品av| 精品露脸国产偷人在视频| 日韩精品免费在线视频| 欧美在线日韩在线| 欧美激情精品久久久久久黑人| 亚洲欧美资源在线| 日韩av手机在线看| 51视频国产精品一区二区| 亚洲va欧美va国产综合剧情| 欧美一区深夜视频| 国产日韩欧美中文| 最近2019年手机中文字幕| 欧美理论电影在线播放| 欧美韩日一区二区| 色小说视频一区| 欧美激情久久久久久| 青青精品视频播放| 欧美理论电影在线播放| 97国产在线观看| 日韩精品中文字幕在线观看| 国产精品久久久久一区二区| 亚洲欧美中文日韩在线v日本| 在线播放精品一区二区三区| 久久精品国产2020观看福利| 欧美主播福利视频| 国产精品爽爽爽| 亚洲精品久久久久久久久久久久|