成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JVM調(diào)優(yōu)總結(jié):新一代的垃圾回收算法

開發(fā) 后端 算法
為了達(dá)到實(shí)時(shí)性的要求(其實(shí)Java語言最初的設(shè)計(jì)也是在嵌入式系統(tǒng)上的),一種新垃圾回收方式呼之欲出,它既支持短的暫停時(shí)間,又支持大的內(nèi)存空間分配。可以很好的解決傳統(tǒng)分代方式帶來的問題。詳細(xì)請(qǐng)看下文。

垃圾回收的瓶頸

傳統(tǒng)分代垃圾回收方式,已經(jīng)在一定程度上把垃圾回收給應(yīng)用帶來的負(fù)擔(dān)降到了最小,把應(yīng)用的吞吐量推到了一個(gè)極限。但是他無法解決的一個(gè)問題,就是Full GC所帶來的應(yīng)用暫停。在一些對(duì)實(shí)時(shí)性要求很高的應(yīng)用場(chǎng)景下,GC暫停所帶來的請(qǐng)求堆積和請(qǐng)求失敗是無法接受的。這類應(yīng)用可能要求請(qǐng)求的返回時(shí)間在幾百甚至幾十毫秒以內(nèi),如果分代垃圾回收方式要達(dá)到這個(gè)指標(biāo),只能把最大堆的設(shè)置限制在一個(gè)相對(duì)較小范圍內(nèi),但是這樣有限制了應(yīng)用本身的處理能力,同樣也是不可接收的。

分代垃圾回收方式確實(shí)也考慮了實(shí)時(shí)性要求而提供了并發(fā)回收器,支持最大暫停時(shí)間的設(shè)置,但是受限于分代垃圾回收的內(nèi)存劃分模型,其效果也不是很理想。

為了達(dá)到實(shí)時(shí)性的要求(其實(shí)Java語言最初的設(shè)計(jì)也是在嵌入式系統(tǒng)上的),一種新垃圾回收方式呼之欲出,它既支持短的暫停時(shí)間,又支持大的內(nèi)存空間分配。可以很好的解決傳統(tǒng)分代方式帶來的問題。

增量收集的演進(jìn)

增量收集的方式在理論上可以解決傳統(tǒng)分代方式帶來的問題。增量收集把對(duì)堆空間劃分成一系列內(nèi)存塊,使用時(shí),先使用其中一部分(不會(huì)全部用完),垃圾收集時(shí)把之前用掉的部分中的存活對(duì)象再放到后面沒有用的空間中,這樣可以實(shí)現(xiàn)一直邊使用邊收集的效果,避免了傳統(tǒng)分代方式整個(gè)使用完了再暫停的回收的情況。

當(dāng)然,傳統(tǒng)分代收集方式也提供了并發(fā)收集,但是他有一個(gè)很致命的地方,就是把整個(gè)堆做為一個(gè)內(nèi)存塊,這樣一方面會(huì)造成碎片(無法壓縮),另一方面他的每次收集都是對(duì)整個(gè)堆的收集,無法進(jìn)行選擇,在暫停時(shí)間的控制上還是很弱。而增量方式,通過內(nèi)存空間的分塊,恰恰可以解決上面問題。

Garbage Firest(G1)

這部分的內(nèi)容主要參考這里,這篇文章算是對(duì)G1算法論文的解讀。我也沒加什么東西了。

目  標(biāo)

從設(shè)計(jì)目標(biāo)看G1完全是為了大型應(yīng)用而準(zhǔn)備的。

支持很大的堆
高吞吐量
--支持多CPU和垃圾回收線程
--在主線程暫停的情況下,使用并行收集
--在主線程運(yùn)行的情況下,使用并發(fā)收
實(shí)時(shí)目標(biāo):可配置在N毫秒內(nèi)最多只占用M毫秒的時(shí)間進(jìn)行垃圾回收

當(dāng)然G1要達(dá)到實(shí)時(shí)性的要求,相對(duì)傳統(tǒng)的分代回收算法,在性能上會(huì)有一些損失。

算法詳解

G1可謂博采眾家之長(zhǎng),力求到達(dá)一種完美。他吸取了增量收集優(yōu)點(diǎn),把整個(gè)堆劃分為一個(gè)一個(gè)等大小的區(qū)域(region)。內(nèi)存的回收和劃分都以region為單位;同時(shí),他也吸取了CMS的特點(diǎn),把這個(gè)垃圾回收過程分為幾個(gè)階段,分散一個(gè)垃圾回收過程;而且,G1也認(rèn)同分代垃圾回收的思想,認(rèn)為不同對(duì)象的生命周期不同,可以采取不同收集方式,因此,它也支持分代的垃圾回收。為了達(dá)到對(duì)回收時(shí)間的可預(yù)計(jì)性,G1在掃描了region以后,對(duì)其中的活躍對(duì)象的大小進(jìn)行排序,首先會(huì)收集那些活躍對(duì)象小的region,以便快速回收空間(要復(fù)制的活躍對(duì)象少了),因?yàn)榛钴S對(duì)象小,里面可以認(rèn)為多數(shù)都是垃圾,所以這種方式被稱為Garbage First(G1)的垃圾回收算法,即:垃圾優(yōu)先的回收。

回收步驟:

初始標(biāo)記(Initial Marking)

G1對(duì)于每個(gè)region都保存了兩個(gè)標(biāo)識(shí)用的bitmap,一個(gè)為previous marking bitmap,一個(gè)為next marking bitmap,bitmap中包含了一個(gè)bit的地址信息來指向?qū)ο蟮钠鹗键c(diǎn)。

開始Initial Marking之前,首先并發(fā)的清空next marking bitmap,然后停止所有應(yīng)用線程,并掃描標(biāo)識(shí)出每個(gè)region中root可直接訪問到的對(duì)象,將region中top的值放入next top at mark start(TAMS)中,之后恢復(fù)所有應(yīng)用線程。

觸發(fā)這個(gè)步驟執(zhí)行的條件為:

G1定義了一個(gè)JVM Heap大小的百分比的閥值,稱為h,另外還有一個(gè)H,H的值為(1-h)*Heap Size,目前這個(gè)h的值是固定的,后續(xù)G1也許會(huì)將其改為動(dòng)態(tài)的,根據(jù)jvm的運(yùn)行情況來動(dòng)態(tài)的調(diào)整,在分代方式下,G1還定義了一個(gè)u以及soft limit,soft limit的值為H-u*Heap Size,當(dāng)Heap中使用的內(nèi)存超過了soft limit值時(shí),就會(huì)在一次clean up執(zhí)行完畢后在應(yīng)用允許的GC暫停時(shí)間范圍內(nèi)盡快的執(zhí)行此步驟;

在pure方式下,G1將marking與clean up組成一個(gè)環(huán),以便clean up能充分的使用marking的信息,當(dāng)clean up開始回收時(shí),首先回收能夠帶來最多內(nèi)存空間的regions,當(dāng)經(jīng)過多次的clean up,回收到?jīng)]多少空間的regions時(shí),G1重新初始化一個(gè)新的marking與clean up構(gòu)成的環(huán)。

并發(fā)標(biāo)記(Concurrent Marking)

按照之前Initial Marking掃描到的對(duì)象進(jìn)行遍歷,以識(shí)別這些對(duì)象的下層對(duì)象的活躍狀態(tài),對(duì)于在此期間應(yīng)用線程并發(fā)修改的對(duì)象的以來關(guān)系則記錄到remembered set logs中,新創(chuàng)建的對(duì)象則放入比top值更高的地址區(qū)間中,這些新創(chuàng)建的對(duì)象默認(rèn)狀態(tài)即為活躍的,同時(shí)修改top值。

最終標(biāo)記暫停(Final Marking Pause)

當(dāng)應(yīng)用線程的remembered set logs未滿時(shí),是不會(huì)放入filled RS buffers中的,在這樣的情況下,這些remebered set logs中記錄的card的修改就會(huì)被更新了,因此需要這一步,這一步要做的就是把應(yīng)用線程中存在的remembered set logs的內(nèi)容進(jìn)行處理,并相應(yīng)的修改remembered sets,這一步需要暫停應(yīng)用,并行的運(yùn)行。

存活對(duì)象計(jì)算及清除(Live Data Counting and Cleanup)

值得注意的是,在G1中,并不是說Final Marking Pause執(zhí)行完了,就肯定執(zhí)行Cleanup這步的,由于這步需要暫停應(yīng)用,G1為了能夠達(dá)到準(zhǔn)實(shí)時(shí)的要求,需要根據(jù)用戶指定的最大的GC造成的暫停時(shí)間來合理的規(guī)劃什么時(shí)候執(zhí)行Cleanup,另外還有幾種情況也是會(huì)觸發(fā)這個(gè)步驟的執(zhí)行的:

G1采用的是復(fù)制方法來進(jìn)行收集,必須保證每次的”to space”的空間都是夠的,因此G1采取的策略是當(dāng)已經(jīng)使用的內(nèi)存空間達(dá)到了H時(shí),就執(zhí)行Cleanup這個(gè)步驟;

對(duì)于full-young和partially-young的分代模式的G1而言,則還有情況會(huì)觸發(fā)Cleanup的執(zhí)行,full-young模式下,G1根據(jù)應(yīng)用可接受的暫停時(shí)間、回收young regions需要消耗的時(shí)間來估算出一個(gè)yound regions的數(shù)量值,當(dāng)JVM中分配對(duì)象的young regions的數(shù)量達(dá)到此值時(shí),Cleanup就會(huì)執(zhí)行;partially-young模式下,則會(huì)盡量頻繁的在應(yīng)用可接受的暫停時(shí)間范圍內(nèi)執(zhí)行Cleanup,并最大限度的去執(zhí)行non-young regions的Cleanup。

展  望

以后JVM的調(diào)優(yōu)或許跟多需要針對(duì)G1算法進(jìn)行調(diào)優(yōu)了。

原文鏈接:http://pengjiaheng.iteye.com/blog/548472

【編輯推薦】

  1. JVM調(diào)優(yōu)總結(jié):典型配置舉例
  2. JVM調(diào)優(yōu)總結(jié):分代垃圾回收詳述
  3. JVM調(diào)優(yōu)總結(jié):垃圾回收面臨的問題
  4. JVM調(diào)優(yōu)總結(jié):基本垃圾回收算法
  5. JVM調(diào)優(yōu)總結(jié):一些概念
責(zé)任編輯:林師授 來源: 和你在一起的博客
相關(guān)推薦

2010-09-26 13:29:46

JVM垃圾回收

2012-01-10 11:19:35

JavaJVM

2012-01-09 16:53:36

JavaJVM

2012-01-09 17:06:16

JavaJVM

2020-08-07 14:05:02

垃圾回收器ZGC

2021-11-05 15:23:20

JVM回收算法

2021-02-04 10:43:52

開發(fā)技能代碼

2010-09-26 11:22:22

JVM垃圾回收JVM

2015-07-06 10:14:25

Java垃圾回收實(shí)戰(zhàn)

2022-03-21 11:33:11

JVM垃圾回收器垃圾回收算法

2017-08-04 10:53:30

回收算法JVM垃圾回收器

2022-01-20 10:34:49

JVM垃圾回收算法

2011-12-07 12:00:06

ibmdw

2012-01-10 14:35:08

JavaJVM

2010-01-14 11:28:54

JVM分代垃圾回收

2017-04-25 14:39:55

JVM內(nèi)存Java

2014-12-19 11:07:40

Java

2010-09-27 09:01:26

JVM分代垃圾回收

2009-12-25 16:15:31

JVM垃圾回收算法

2012-01-10 15:13:56

JavaJVM
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美一区二区三区电影 | 99久久精品国产一区二区三区 | 精品国产乱码久久久久久蜜柚 | 国产精品午夜电影 | 国产资源在线观看 | 一区二区三区欧美在线观看 | 福利电影在线 | 亚洲字幕在线观看 | 国产91久久久久 | 中文字幕国产一区 | 日韩电影中文字幕 | 久久电影一区 | 中文字幕在线观看视频一区 | 久久久久九九九九 | 人人干人人超 | 国产中文| 日本精品免费在线观看 | 久久免费福利 | 中文字幕一区二区不卡 | 本道综合精品 | 成人福利视频 | 91大神在线看 | 一二三四在线视频观看社区 | 欧美久久久网站 | 国产精品自产拍 | 国产成人自拍一区 | 天天操天天射综合 | 99re视频这里只有精品 | 99小视频 | 欧美精品久久久久久久久久 | 欧美.com| 精品九九久久 | 蜜桃精品在线 | 97国产爽爽爽久久久 | 91av在线免费播放 | av片免费 | 日本一区二区三区在线观看 | 免费黄视频网站 | 久久久99国产精品免费 | 99精品国产一区二区青青牛奶 | 影音先锋男 |