开发者社区 问答 正文

关于 CMS

[小雨] 请教大家一个问题,CMS的回收阶段是并发清除,应用线程和gc线程并发执行,gc线程根据最终标记阶段的标记进行清除。有一个问题,因为应用线程在并发清除阶段也在run,也有可能申请空间,因为已经过了最终标记阶段,那么申请的空间肯定没有拿到当前空间存活的标记,那gc线程在gc时,是如何识别这些空间使得其继续存活的?
image.png

来源:云原生后端社区https://www.yuque.com/server_mind/answer

展开
收起
montos 2020-04-20 17:29:47 602 分享 版权
1 条回答
写回答
取消 提交回答
  • [重庆-后端-谭鹏] CMS在初始标记阶段和重新标记阶段会暂停所有的应用线程,在并发收集时会和用户线程并发运行。这个只是针对老年代的回收!!而在新生代的回收是是会暂停应用线程的。 也就是说CMS针对新生代和老年代的回收策略是有所不同的(?编辑标识:CMS应该与新生代无关)。对于新生代,采用完全暂停应用线程的做法。
    [小雨]**** @重庆-后端-谭鹏 如果在并发清除的阶段,有年轻代的对象晋升到了老年代,晋升上来的空间是没有被  标记的,gc是如何知道这块空间没有被标记但是不需要回收的?
    [重庆-后端-谭鹏]
    默认15岁的新生代对象才会被晋升到老年代。 而本次GC才进行到并发清除阶段,他的年龄怎么会长呢?只有在下一次gc时,他再被标记一次年龄长一岁,满足了进去老年代的条件才会晋升
    [北京-Java-碧海青天] @重庆-后端-谭鹏 CMS回收时新生代GC也可能进行啊,二者是独立的,怎么就不会有新生代对象晋升到老年代呢?即使没达到晋升年龄,也有提前晋升的场景,不可能老年代回收时阻止对象进入老年代
    [重庆-后端-谭鹏] 对 晋升到老年代 不单单是只看年龄 还有好几种其他情况
    [小雨] @重庆-后端-谭鹏 @北京-Java-碧海青天 我理解,青天的意思是,我举的那个例子还是有可能出现的。在CMS并发清除的阶段中,也会有新生代空间晋升,这部分晋升的空间,是怎么处理的?
    @重庆-后端-谭鹏 @北京-Java-碧海青天 我和同事又讨论了一下 应该是晋升到老年代的年轻对象 也是被标记的 gc线程在回收时 只会回收没有标记的对象 所以我举的例子是可以hold住的
    [重庆-后端-谭鹏]
    这个种情况的下的对象晋升 我也不清楚CMS具体是怎么处理的 还需要继续学习** **

    来源:云原生后端社区https://www.yuque.com/server_mind/answer

    2020-04-20 17:30:03
    赞同 展开评论
问答分类:
问答地址: