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

首頁 > 編程 > Java > 正文

Java GC的那些事(2)

2019-11-11 06:03:17
字體:
來源:轉載
供稿:網友

學習java的同學注意了?。。?nbsp;學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:183993990  我們一起學Java!

收集算法

垃圾收集算法主要有:標記-清除、復制和標記-整理。

1、標記-清除算法

對待回收的對象進行標記。算法缺點:效率問題,標記和清除過程效率都很低;空間問題,收集之后會產生大量的內存碎片,不利于大對象的分配。

2、復制算法

復制算法將可用內存劃分成大小相等的兩塊A和B,每次只使用其中一塊,當A的內存用完了,就把存活的對象復制到B,并清空A的內存,不僅提高了標記的效率,因為只需要標記存活的對象,同時也避免了內存碎片的問題,代價是可用內存縮小為原來的一半。

3、標記-整理算法

在老年代中,對象存活率較高,復制算法的效率很低。在標記-整理算法中,標記出所有存活的對象,并移動到一端,然后直接清理邊界以外的內存。

對象標記過程

在可達性分析過程中,為了準確找出與GC Roots相關聯的對象,必須要求整個執行引擎看起來像是被凍結在某個時間點上,即暫停所有運行中的線程,不可以出現對象的引用關系還在不斷變化的情況。

如何快速枚舉GC Roots?

GC Roots主要在全局性的引用(常量或類靜態屬性)與執行上下文(本地變量表中的引用)中,很多應用僅僅方法區就上百兆,如果進行遍歷查找,效率會非常低下。

在HotSpot中,使用一組稱為OopMap的數據結構進行實現。類加載完成時,HotSpot把對象內什么偏移量上是什么類型的數據計算出來存儲到OopMap中,通過JIT編譯出來的本地代碼,也會記錄下棧和寄存器中哪些位置是引用。GC發生時,通過掃描OopMap的數據就可以快速標識出存活的對象。

如何安全的GC?

線程運行時,只有在到達安全點(Safe Point)才能停頓下來進行GC。

基于OopMap數據結構,HotSpot可以快速完成GC Roots的遍歷,不過HotSpot并不會為每條指令都生成對應的OopMap,只會在Safe Point處記錄這些信息。

所以Safe Point的選擇很重要,如果太少可能導致GC等待的時間太長,如果太頻繁可能導致運行時的性能問題。大部分指令的執行時間都非常短暫,通常會選擇一些執行時間較長的指令作為Safe Point,如方法調用、循環跳轉和異常跳轉等。

關于Safe Point更多的信息,可以看看這篇文章 JVM的Stop The World,安全點,黑暗的地底世界

發生GC時,如何讓所有線程跑到最近的Safe Point再暫停?

當發生GC時,不直接對線程進行中斷操作,而是簡單的設置一個中斷標志,每個線程運行到Safe Point的時候,主動去輪詢這個中斷標志,如果中斷標志為真,則將自己進行中斷掛起。

這里忽略了一個問題,當發生GC時,運行中的線程可以跑到Safe Point后進行掛起,而那些處于Sleep或Blocked狀態的線程在此時無法響應JVM的中斷請求,無法到Safe Point處進行掛起,針對這種情況,可以使用安全區域(Safe Region)進行解決。

Safe Region是指在一段代碼片段中,對象的引用關系不會發生變化,在這個區域中的任何位置開始GC都是安全的。1、當線程運行到Safe Region的代碼時,首先標識已經進入了Safe Region,如果這段時間內發生GC,JVM會忽略標識為Safe Region狀態的線程;2、當線程即將離開Safe Region時,會檢查JVM是否已經完成GC,如果完成了,則繼續運行,否則線程必須等待直到收到可以安全離開Safe Region的信號為止;

垃圾收集器

Java虛擬機規范并沒有規定垃圾收集器應該如何實現,用戶可以根據系統特點對各個區域所使用的收集器進行組合使用。

上圖展示了7種不同分代的收集器,如果兩兩之間存在連線,說明可以組合使用。

1、Serial收集器(串行GC)

Serial 是一個采用單個線程并基于復制算法工作在新生代的收集器,進行垃圾收集時,必須暫停其他所有的工作線程。對于單CPU環境來說,Serial由于沒有線程交互的開銷,可以很高效的進行垃圾收集動作,是Client模式下新生代默認的收集器。

2、ParNew收集器(并行GC)

ParNew其實是serial的多線程版本,除了使用多條線程進行垃圾收集之外,其余行為與Serial一樣。

3、Parallel Scavenge收集器(并行回收GC)

Parallel Scavenge是一個采用多線程基于復制算法并工作在新生代的收集器,其關注點在于達到一個可控的吞吐量,經常被稱為“吞吐量優先”的收集器。

吞吐量 = 用戶代碼運行時間 /(用戶代碼運行時間 + 垃圾收集時間)

Parallel Scavenge提供了兩個參數用于精確控制吞吐量:1、-XX:MaxGCPauseMillis 設置垃圾收集的最大停頓時間2、-XX:GCTimeRatio 設置吞吐量大小

4、Serial Old收集器(串行GC)

Serial Old 是一個采用單線程基于標記-整理算法并工作在老年代的收集器,是Client模式下老年代默認的收集器。

5、Parallel Old收集器(并行GC)

Parallel Old是一個采用多線程基于標記-整理算法并工作在老年代的收集器。在注重吞吐量以及CPU資源敏感的場合,可以優先考慮Parallel Scavenge和Parallel Old的收集器組合。

6、CMS收集器(并發GC)

CMS(Concurrent Mark Sweep)是一種以獲取最短回收停頓時間為目標的收集器,工作在老年代,基于“標記-清除”算法實現,整個過程分為以下4步:

1、初始標記:這個過程只是標記以下GC Roots能夠直接關聯的對象,但是仍然會Stop The World;2、并發標記:進行GC Roots Tracing的過程,可以和用戶線程一起工作。3、重新標記:用于修正并發標記期間由于用戶程序繼續運行而導致標記產生變動的那部分記錄,這個過程會暫停所有線程,但其停頓時間遠比并發標記的時間短;4、并發清理:可以和用戶線程一起工作。

CMS收集器的缺點:

1、對CPU資源比較敏感,在并發階段,雖然不會導致用戶線程停頓,但是會占用一部分線程資源,降低系統的總吞吐量。2、無法處理浮動垃圾,在并發清理階段,用戶線程的運行依然會產生新的垃圾對象,這部分垃圾只能在下一次GC時收集。3、CMS是基于標記-清除算法實現的,意味著收集結束后會造成大量的內存碎片,可能導致出現老年代剩余空間很大,卻無法找到足夠大的連續空間分配當前對象,不得不提前觸發一次Full GC。

JDK1.5實現中,當老年代空間使用率達到68%時,就會觸發CMS收集器,如果應用中老年代增長不是太快,可以通過-XX:CMSInitiatingOccupancyFraction參數提高觸發百分比,從而降低內存回收次數提高系統性能。

JDK1.6實現中,觸發CMS收集器的閾值已經提升到92%,要是CMS運行期間預留的內存無法滿足用戶線程需要,會出現一次”Concurrent Mode Failure”失敗,這是虛擬機會啟動Serial Old收集器對老年代進行垃圾收集,當然,這樣應用的停頓時間就更長了,所以這個閾值也不能設置的太高,如果導致了”Concurrent Mode Failure”失敗,反而會降低性能,至于如何設置這個閾值,還得長時間的對老年代空間的使用情況進行監控。

7、G1收集器

G1(Garbage First)是JDK1.7提供的一個工作在新生代和老年代的收集器,基于“標記-整理”算法實現,在收集結束后可以避免內存碎片問題。

G1優點:

1、并行與并發:充分利用多CPU來縮短Stop The World的停頓時間;2、分代收集:不需要其他收集配合就可以管理整個Java堆,采用不同的方式處理新建的對象、已經存活一段時間和經歷過多次GC的對象獲取更好的收集效果;3、空間整合:與CMS的”標記-清除”算法不同,G1在運行期間不會產生內存空間碎片,有利于應用的長時間運行,且分配大對象時,不會導致由于無法申請到足夠大的連續內存而提前觸發一次Full GC;4、停頓預測:G1中可以建立可預測的停頓時間模型,能讓使用者明確指定在M毫秒的時間片段內,消耗在垃圾收集上的時間不得超過N毫秒。

使用G1收集器時,Java堆的內存布局與其他收集器有很大區別,整個Java堆會被劃分為多個大小相等的獨立區域Region,新生代和老年代不再是物理隔離了,都是一部分Region(不需要連續)的集合。G1會跟蹤各個Region的垃圾收集情況(回收空間大小和回收消耗的時間),維護一個優先列表,根據允許的收集時間,優先回收價值最大的Region,避免在整個Java堆上進行全區域的垃圾回收,確保了G1收集器可以在有限的時間內盡可能收集更多的垃圾。

不過問題來了:使用G1收集器,一個對象分配在某個Region中,可以和Java堆上任意的對象有引用關系,那么如何判定一個對象是否存活,是否需要掃描整個Java堆?其實這個問題在之前收集器中也存在,如果回收新生代的對象時,不得不同時掃描老年代的話,會大大降低Minor GC的效率。

針對這種情況,虛擬機提供了一個解決方案:G1收集器中Region之間的對象引用關系和其他收集器中新生代與老年代之間的對象引用關系被保存在Remenbered Set數據結構中,用來避免全堆掃描。G1中每個Region都有一個對應的Remenbered Set,當虛擬機發現程序對Reference類型的數據進行寫操作時,會產生一個Write Barrier暫時中斷寫操作,檢查Reference引用的對象是否處于相同的Region中,如果不是,則通過CardTable把相關引用信息記錄到被引用對象所屬Region的Remenbered Set中。

學習Java的同學注意了!?。?nbsp;學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:183993990  我們一起學Java!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美另类极品videosbestfree| 欧美亚洲一级片| 亚洲福利小视频| 国产99久久久欧美黑人| 欧美精品激情在线| 欧美色xxxx| 国产精品白丝jk喷水视频一区| 欧美激情精品在线| 国产精品一区二区久久久| 成人午夜在线视频一区| 亚洲欧美一区二区三区四区| 国产精品∨欧美精品v日韩精品| 97精品在线观看| 91探花福利精品国产自产在线| 欧美性生活大片免费观看网址| 少妇高潮 亚洲精品| 中文字幕亚洲综合久久筱田步美| 粉嫩老牛aⅴ一区二区三区| 亚洲精品日产aⅴ| 国产精品一区二区久久久久| 日韩av网站导航| 亚洲欧美中文日韩在线| 国产精品丝袜高跟| 欧美日韩美女在线| 日韩电视剧免费观看网站| 中文字幕日韩免费视频| 日韩欧美精品免费在线| 国产成人精品国内自产拍免费看| 亚洲综合在线播放| 这里只有精品视频在线| 亚洲第一国产精品| 日本欧美在线视频| 最近2019年好看中文字幕视频| 国内精品小视频在线观看| www国产亚洲精品久久网站| 午夜精品福利电影| 精品性高朝久久久久久久| 亚洲国产小视频在线观看| 亚洲大胆人体av| 成人av.网址在线网站| 国产日韩欧美视频| 亚洲欧美激情另类校园| 亚洲天堂第二页| 精品爽片免费看久久| 欧美精品电影免费在线观看| 日本高清+成人网在线观看| 亚洲欧美日韩中文在线制服| 国产一区二区三区直播精品电影| 亚洲国产天堂久久综合| 精品女厕一区二区三区| 成人在线视频网站| 亚洲自拍小视频免费观看| 亚洲成人免费网站| 日韩动漫免费观看电视剧高清| 91免费福利视频| 在线视频欧美日韩精品| 成人亚洲欧美一区二区三区| 成人欧美一区二区三区在线湿哒哒| 亚洲精品久久7777777| 97超级碰碰碰| 精品亚洲男同gayvideo网站| 亚洲裸体xxxx| 日韩亚洲欧美中文在线| 97精品在线视频| 日韩电影免费观看在线| 精品国产福利在线| 国产精品视频网址| 97精品一区二区视频在线观看| 51久久精品夜色国产麻豆| 午夜精品视频在线| 久久精品国产亚洲一区二区| 亚洲图片欧美日产| 欧美性在线观看| 中文字幕无线精品亚洲乱码一区| 国产精品香蕉在线观看| 欧美成人激情视频| 亚洲精品福利在线观看| 亚洲国产天堂久久综合| 亚洲天堂免费在线| 欧美电影在线观看完整版| 一区二区国产精品视频| 91av在线播放视频| 欧美亚州一区二区三区| 91在线精品视频| 韩国美女主播一区| 欧洲成人免费aa| 91在线无精精品一区二区| 国产精品精品视频| 久久精品国产电影| 亚洲人成欧美中文字幕| 久久久久久久999精品视频| 久久精品电影一区二区| 午夜精品美女自拍福到在线| 欧美亚洲视频一区二区| 欧美黑人狂野猛交老妇| 久久久欧美精品| 欧美性受xxxx白人性爽| 久久成人精品电影| 欧美高清视频一区二区| 日韩国产欧美精品在线| 亚洲精品成人av| 欧美性xxxxxxx| 色偷偷偷综合中文字幕;dd| 国产91|九色| 日韩久久免费电影| 色婷婷av一区二区三区久久| 精品国产一区二区三区久久狼黑人| 国产精品久久久久久久久影视| 亚洲综合社区网| 欧美性猛交xxxxx免费看| 日韩一区二区欧美| 黑人巨大精品欧美一区二区| 中文字幕亚洲天堂| 国产精品69久久| 亚洲一区二区久久久| 精品国产31久久久久久| 亚洲欧美日韩国产精品| 亚洲国产99精品国自产| 久久国产一区二区三区| 精品国产精品三级精品av网址| 国产香蕉精品视频一区二区三区| 亚洲国产中文字幕久久网| 亚洲免费成人av电影| 爽爽爽爽爽爽爽成人免费观看| 亚洲一区中文字幕在线观看| 伊人亚洲福利一区二区三区| 亚洲精品在线观看www| 中文字幕久热精品视频在线| 久久久人成影片一区二区三区观看| 亚洲国产美女精品久久久久∴| 久久人人爽人人爽人人片亚洲| 精品日本美女福利在线观看| 亚洲国产精久久久久久久| 久久中文久久字幕| 亚洲性69xxxbbb| 国产剧情久久久久久| 国内精品小视频| 大胆欧美人体视频| 91国产美女在线观看| 在线观看精品自拍私拍| 日韩国产激情在线| 欧美小视频在线| 欧美一区深夜视频| 欧美黄色片免费观看| 日本高清+成人网在线观看| 国产成人久久久精品一区| 国产精品盗摄久久久| 久久久免费高清电视剧观看| 国产精品91一区| 精品亚洲一区二区三区在线播放| 日韩欧美精品免费在线| 欧美人成在线视频| 91久久久国产精品| 亚洲国产日韩欧美在线99| 国产一区二区三区毛片| 欧美人与性动交a欧美精品| 亚洲韩国欧洲国产日产av| 日韩欧美国产视频| 中文字幕成人在线| 国产精品久久久久影院日本| 91精品啪在线观看麻豆免费| 亚洲精品一区二区三区不| 亚洲自拍偷拍区| 91免费电影网站|