- 1、本文档共28页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
G1垃圾收集器架构和如何做到可预测的停顿(阿⾥)
CMS垃圾回收机制参考:
CMS与G1的区别参考:
写这篇⽂章是基于阿⾥⾯试官的⼀个问题:众所周期,G1跟其他的垃圾回收算法差别很⼤,你了解G1的垃圾回收架构吗?为什么G1可以做
到回收时间⽤户可以设定?
G1垃圾回收器其实是JDK7的特性,在⽬前JDK10都已经发布的情况下,已经不是什么新特性了,⽽我到它现在才关注它,可见我是有多么
的懒;⽽我终于关注它了,可见我的懒还算是有救的:)
G1其实是GarbageFirst的意思,垃圾优先?不是,是优先处理那些垃圾多的内存块的意思。在⼤的理念上,它还是遵循JVM的内存分代假设
(其实叫假设不准确,这是从实际Java应⽤的内存使⽤观察得到的结论):
90%的对象熬不过第⼀次垃圾回收,⽽⽼的对象(经历了好⼏次垃圾回收的对象)则有98%的概率会⼀直活下来。
基于这个分代假设,⼀般的垃圾回收器把内存分成三类:Eden(E),Suvivor(S)和Old(O),其中Eden和Survivor都属于年轻代,Old属于⽼年
代,新对象始终分配在Eden⾥⾯,熬过⼀次垃圾回收的对象就被移动到Survisor区了,经过数次垃圾回收之后还活着的对象会被移到Old
区。
⼀般GC的内存分布
这样分代的好处是,把⼀个复杂的⼤问题,分成两类不同的⼩问题,针对不同的⼩问题,采⽤更有针对性的措施(分⽽治之):
对于年轻代的对象,由于对象来的快去得快,垃圾收集会⽐较频繁,因此执⾏时间⼀定要短,效率要⾼,因此要采⽤执⾏时间短,执
⾏时间的长短只取决于对象个数的垃圾回收算法。但是这类回收器往往会⽐较浪费内存,⽐如CopyingGC,会浪费⼀半的内存,以空
间换取了时间。
对于⽼年代的对象,由于本⾝对象的个数不多,垃圾收集的次数不多,因此可以采⽤对内存使⽤⽐较⾼效的算法。
跟其它垃圾回收器不⼀样的是:G1虽然也把内存分成了这三⼤类,但是在G1⾥⾯这三⼤类不是泾渭分明的三⼤块内存,G1把内存划分成很
多⼩块,每个⼩块会被标记为E/S/O中的⼀个,可以前⾯⼀个是Eden后⾯⼀个就变成Survivor了。
G1的内存分布
这么做给G1带来了很⼤的好处,由于把三块内存变成了⼏百块内存,内存块的粒度变⼩了,从⽽可以垃圾回收⼯作更彻底的并⾏化。
G1的并⾏收集做得特别好,我们第⼀次听到并⾏收集应该是CMS(ConcurrentMarkSweep)垃圾回收算法,但是CMS的并⾏收集也只是在
收集⽼年代能够起效,⽽在回收年轻代的时候CMS是要暂停整个应⽤的(Stop-the-world)。⽽G1整个收集全程⼏乎都是并⾏的,它回收的⼤
致过程是这样的:
在垃圾回收的最开始有⼀个短暂的时间段(InitalMark)会停⽌应⽤(stop-the-world)
然后应⽤继续运⾏,同时G1开始ConcurrentMark
再次停⽌应⽤,来⼀个FinalMark(stop-the-world)
最后根据GarbageFirst的原则,选择⼀些内存块进⾏回收。(stop-the-world)
由于它⾼度的并⾏化,因此它在应⽤停⽌时间(Stop-the-world)这个指标上⽐其它的GC算法都要好。
G1的另⼀个显著特点他能够让⽤户设置应⽤的暂停时间,为什么G1能做到这⼀点呢?也许你已经注意到了,G1回收的第4步,它是选择“⼀
些内存块”,⽽不是整代内存来回收,这是G1跟其它GC⾮常不同的⼀点,其它GC每次回收都会回收整个Generation的内存(Eden,Old),⽽回
收内存所需的时间就取决于内存的⼤⼩,以及实际垃圾的多少,所以垃圾回收时间是不可控的;⽽G1每次并不会回收整代内存,到底回收
多少内存就看⽤户配置的暂停时间,配置的时间短就少回收点,配置的时间长就多回收点,伸缩⾃如。(阿⾥⾯试)
由于内存被分成了很多⼩块,⼜带来了另外好处,由于内存块⽐较⼩,进⾏内存压缩整理的代价都⽐较⼩,相⽐其它GC算法,可以有效的
规避内存碎⽚的问题。
说了G1的这么多好处,也该说说G1的坏处了,如果应⽤的内存⾮常吃紧,对内存进⾏部分回收根本不够,始终要进⾏整个Heap的回收,那
么G1要做的⼯作量就⼀点也不会⽐其它垃圾回收器少,⽽且因为本⾝算法复杂了⼀点,可能⽐其它回收器还要差。因此G1⽐较适合内存稍
⼤⼀点的应⽤(⼀般来说⾄少4G以上),⼩内存的应⽤还是⽤传统的垃圾回收器⽐如CMS⽐较合适。
总结
G1通过在垃
文档评论(0)