
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
垃圾回收机制的学习与使用是每一位软件编程开发程序员都需要熟练掌握的一个编程知识点的,而本文我们就简单来垃圾一下,Java编程垃圾回收机制分享。
1.分代收集
说到垃圾收集器不得不提的一个理论就是“分代收集”,因为目前商用虚拟机的垃圾收集器都是基于分代收集的理论进行设计的,它是指将不同“年龄”的数据分配到不同的内存区域中进行存储,所谓的“年龄”指的是经历过垃圾收集的次数。这样我们就可以把那些朝生暮死的对象集中分配到一起,把不容易消亡的对象分配到一起,对于不容易死亡的对象我们就可以设置较短的垃圾收集频率,这样就能消耗更少的资源来实现更理想的功能了。
通常情况下分代收集算法会分为两个区域:新生代(YoungGeneration)和老年代(OldGeneration),其中新生代用于存储刚刚创建的对象,这个区域内的对象存活率不高,而对于经过了一定次数的GC之后还存活下来的对象,就可以成功晋级到老生代了。
对于上面介绍的7个垃圾收集器来说,新生代垃圾收集器有:Serial、ParNew、ParallelScavenge,老生代的垃圾收集器有:SerialOld、ParallelOld、CMS,而G1属于混合型的垃圾收集器。
2.CMS收集器的具体执行流程
CMS收集器是基于标记-清除算法实现的,我们之前有讲过关于标记-清除的算法,这里简单地回顾一下。标记-清除的算法是由标记阶段和清除阶段构成的,标记阶段会给所有的存活对象做上标记;而清除阶段会把被标记为死亡的对象进行回收,而死亡对象的判断是通过引用计数法或者是目前主流的可达性分析算法实现的。但是CMS的实现稍微复杂一些,它的整个过程可以分为四个阶段:
初始标记(CMSinitialmark)
并发标记(CMSconcurrentmark)
重新标记(CMSremark)
并发清除(CMSconcurrentsweep)
初始标记阶段的执行时间很短,它只是标记一下GCRoots的关联对象;并发阶段是从GCRoots关联的对象进行遍历判断并标识死亡对象,这个过程比较慢,但不需要停止用户线程,用户的线程可以和垃圾收集线程并发执行;而重新标记阶段则是为了判断并标记,刚刚并发阶段用户继续运行的那一部分对象,所以此阶段的执行时间也比较短;后是并发清除阶段,也就是清除上面标记的死亡对象,由于CMS使用的是标记-清除算法,而非标记-整理算法,因此无须移动存活的对象,这个阶段垃圾收集线程也可以和用户线程并发执行。
因为CMS是一款基于标记清除算法实现的垃圾收集器,因此会在收集时产生大量的空间碎片,为了解决这个问题,CMS收集器提供了一个-XX:+UseCMS-CompactAtFullCollection的参数(默认是开启的,此参数从JDK9开始废弃),用于在CMS收集器进行FullGC时开启内存碎片的合并和整理。
但又因为碎片整理的过程必须移动存活的对象,所以它和用户线程是无法并发执行的,为了解决这个问题CMS收集器又提供了另外一个参数-XX:CMSFullGCsBefore-Compaction,用于规定多少次(根据此参数的值决定)之后再进行一次碎片整理。
3.CMS存在哪些问题?
CMS的问题:
并发标记并发清除,与用户线程抢占CPU,可能会造成用户线程的效率低,默认回收线程(cpu+3)/4,当然现在的CPU一般都是双核,配置很高不需要考虑
在并发清除阶段长生的垃圾无法回收,得等待下一次回收,产生浮动垃圾
需预留内存空间给用户线程使用,参数CMSInitiatingOccupancyFraction设置回收阈值(老年代空间使用比例),默认92%。失败时产生错误:ConcurremntModeFail,启用备选方案SerialOld进行老年代回收
标记清除产生碎片的问题,无法找到足够连续内存空间分配当前对象时,通过以下参数来调节
-XX:UseCMSCompactAtFullCollection(默认开启),内存空间不够时进行内存整理。
-XX:CMSFullGCsBeforeCompaction:设置在执行多少次FullGC后对内存空间进行压缩整理。默认值0。
4.CMS收集器和G1的区别?
CMS垃圾回收器的机制:
CMS以获取小暂停时间为目的,本质就是通过空间换时间,适用于一些对响应时间有很高要求的应用或网站
CMS和G1区别:
G1将内存划分为区域Region,用户可指定垃圾回收限时,大暂停时间
G1回收得到的内存空间是连续的,CMS垃圾回收产生内存碎片
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。