首页 | 联系我们 | 叶凡网络官方QQ群:323842844
游客,欢迎您! 请登录 免费注册 忘记密码
您所在的位置:首页 > 新闻中心 > 行业新闻 > 正文

名扬互联:关于JVM的新一代的垃圾回收算法

作者:cocomyyz 来源: 日期:2014-2-14 13:15:06 人气:0 加入收藏 评论:0 标签:

已经在一定水平上把垃圾回收给应用带来的负担降到最小,激进分代垃圾回收方式。把应用的吞吐量推到一个极限。但是无法解决的一个问题,就是FullGC所带来的应用暂停。一些对实时性要求很高的应用场景下,GC暂停所带来的请求堆积和请求失败是无法接受的这类应用可能要求请求的返回时间在几百甚至几十毫秒以内,如果分代垃圾回收方式要达到这个指标,只能把最大堆的设置限制在一个相对较小范围内,但是这样有限制了应用自身的处置能力,同样也是不可接收的,支持最大暂停时间的设置,分代垃圾回收方式确实也考虑了实时性要求而提供了并发回收器。但是受限于分代垃圾回收的内存划分模型,其效果也不是很理想。

既支持短的暂停时间,为了达到实时性的要求(其实Java语言最初的设计也是嵌入式系统上的一种新垃圾回收方式呼之欲出。又支持大的内存空间分配。可以很好的解决激进分代方式带来的问题。使用时,增量收集的方式在理论上可以解决激进分代方式带来的问题。增量收集把对堆空间划分成一系列内存块。先使用其中一部分(不会全部用完)垃圾收集时把之前用掉的局部中的存活对象再放到后面没有用的空间中,这样可以实现一直边使用边收集的效果,防止了激进分代方式整个使用完了再暂停的回收的情况。

激进分代收集方式也提供了并发收集,当然。但是有一个很致命的地方,就是把整个堆做为一个内存块,这样一方面会造成碎片(无法压缩)另一方面他每次收集都是对整个堆的收集,无法进行选择,暂停时间的控制上还是很弱。而增量方式,通过内存空间的分块,恰恰可以解决上面问题。

实时目标:可配置在N毫秒内最多只占用M毫秒的时间进行垃圾回收

相对保守的分代回收算法,当然G1要达到实时性的要求。性能上会有一些损失。

力求到达一种完美。吸取了增量收集优点,G1可谓博采众家之长。把整个堆划分为一个一个等大小的区域(region内存的回收和划分都以region为单位;同时,也吸取了CMS特点,把这个垃圾回收过程分为几个阶段,分散一个垃圾回收过程;而且,G1也认同分代垃圾回收的思想,认为不同对象的生命周期不同,可以采取不同收集方式,因此,也支持分代的垃圾回收。为了达到对回收时间的可预计性,G1扫描了region以后,对其中的活跃对象的大小进行排序,首先会收集那些活跃对象小的region以便快速回收空间(要复制的活跃对象少了因为活跃对象小,里面可以认为多数都是垃圾,所以这种方式被称为GarbagFirstG1垃圾回收算法,即:垃圾优先的回收。

回收方法:初始标志(InitialMark,G1对于每个region都保存了两个标识用的bitmap一个为previoumarkbitmap一个为nextmarkbitmapbitmap中包含了一个bit地址信息来指向对象的起始点。首先并发的清空nextmarkbitmap然后停止所有应用线程,开始InitialMark之前。并扫描标识出每个region中root可直接访问到对象,将region中top值放入nexttopatmarkstartTA MS中,之后恢复所有应用线程。

称为h另外还有一个HH值为(1-h*HeapSize目前这个h值是固定的后续G1也许会将其改为动态的根据jvm运行情况来动态的调整,G1定义了一个JVMHeap大小的百分比的阀值。分代方式下,G1还定义了一个u以及softlimitsoftlimit值为H-u*HeapSize当Heap中使用的内存超越了softlimit值时,就会在一次cleanup执行完毕后在应用允许的GC暂停时间范围内尽快的执行此步骤;G1将mark与cleanup组成一个环,pure方式下。以便cleanup能充分的使用mark信息,当cleanup开始回收时,首先回收能够带来最多内存空间的region当经过多次的cleanup回收到没多少空间的region时,G1重新初始化一个新的mark与cleanup构成的环。以识别这些对象的下层对象的活跃状态,依照之前InitialMark扫描到对象进行遍历。对于在此期间应用线程并发修改的对象的以来关系则记录到remembsetlog中,新创建的对象则放入比top值更高的地址区间中,这些新创建的对象默认状态即为活跃的同时修改top值。

不会放入fillRSbuffer中的这样的情况下,当应用线程的remembsetlog未满时。这些remebsetlog中记录的card修改就会被更新了因此需要这一步,这一步要做的就是把应用线程中存在remembsetlog内容进行处置,并相应的修改remembset这一步需要暂停应用,并行的运行。并不是说FinalMarkPaus执行完了就肯定执行Cleanup这步的由于这步需要暂停应用,值得注意的G1中。G1为了能够达到准实时的要求,需要根据用户指定的最大的GC造成的暂停时间来合理的规划什么时候执行Cleanup另外还有几种情况也是会触发这个方法的执行的

必需保证每次的tospace空间都是够的因此G1采取的战略是当已经使用的内存空间达到H时,G1采用的复制方法来进行收集。就执行Cleanup这个方法;则还有情况会触发Cleanup执行,对于full-young和partially-young分代模式的G1而言。full-young模式下,G1根据应用可接受的暂停时间、回收youngregion需要消耗的时间来估算出一个youndregion数量值,当JVM中分配对象的youngregion数量达到此值时,Cleanup就会执行;partially-young模式下,则会尽量频繁的应用可接受的暂停时间范围内执行Cleanup并最大限度的去执行non-youngregionCleanup


本文网址:http://www.mingyangnet.com/html/hangye/1867.html
读完这篇文章后,您心情如何?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
更多>>网友评论
发表评论
编辑推荐
  • 没有资料