[小雨] 请教大家一个问题,CMS的回收阶段是并发清除,应用线程和gc线程并发执行,gc线程根据最终标记阶段的标记进行清除。有一个问题,因为应用线程在并发清除阶段也在run,也有可能申请空间,因为已经过了最终标记阶段,那么申请的空间肯定没有拿到当前空间存活的标记,那gc线程在gc时,是如何识别这些空间使得其继续存活的?
来源:云原生后端社区https://www.yuque.com/server_mind/answer
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
[重庆-后端-谭鹏] CMS在初始标记阶段和重新标记阶段会暂停所有的应用线程,在并发收集时会和用户线程并发运行。这个只是针对老年代的回收!!而在新生代的回收是是会暂停应用线程的。 也就是说CMS针对新生代和老年代的回收策略是有所不同的(?编辑标识:CMS应该与新生代无关)。对于新生代,采用完全暂停应用线程的做法。
[小雨]**** @重庆-后端-谭鹏 如果在并发清除的阶段,有年轻代的对象晋升到了老年代,晋升上来的空间是没有被 标记的,gc是如何知道这块空间没有被标记但是不需要回收的?
[重庆-后端-谭鹏] 默认15岁的新生代对象才会被晋升到老年代。 而本次GC才进行到并发清除阶段,他的年龄怎么会长呢?只有在下一次gc时,他再被标记一次年龄长一岁,满足了进去老年代的条件才会晋升
[北京-Java-碧海青天] @重庆-后端-谭鹏 CMS回收时新生代GC也可能进行啊,二者是独立的,怎么就不会有新生代对象晋升到老年代呢?即使没达到晋升年龄,也有提前晋升的场景,不可能老年代回收时阻止对象进入老年代
[重庆-后端-谭鹏] 对 晋升到老年代 不单单是只看年龄 还有好几种其他情况
[小雨] @重庆-后端-谭鹏 @北京-Java-碧海青天 我理解,青天的意思是,我举的那个例子还是有可能出现的。在CMS并发清除的阶段中,也会有新生代空间晋升,这部分晋升的空间,是怎么处理的?
@重庆-后端-谭鹏 @北京-Java-碧海青天 我和同事又讨论了一下 应该是晋升到老年代的年轻对象 也是被标记的 gc线程在回收时 只会回收没有标记的对象 所以我举的例子是可以hold住的
[重庆-后端-谭鹏] 这个种情况的下的对象晋升 我也不清楚CMS具体是怎么处理的 还需要继续学习** **
来源:云原生后端社区https://www.yuque.com/server_mind/answer