关于CMS收集器的一点疑问。

当并发标记完之后要进行重新标记。那么并发标记的意义是什么?直接重新标记不就完了?
还有标记清除算法。如果清除后剩余的存活对象之间连续的内存不够分配给下一个对象,会OOM吗?
CMS为什么要有一个初始标记的过程呢,而不是直接并发标记?
求解惑,谢谢。

全部评论
首先CMS是一个old gen收集器。 initial mark阶段需要找到所有的GC roots,这个阶段会STW,GC roots选取比较快,所以停顿时间不会太长。 concurrent mark阶段,GC roots tracing,扫描整个heap上(包括young gen和old gen)的所有存活的对象,这个阶段是和用户线程并发执行的,用户线程感知不到停顿。 remark阶段,需要修正在concurrent mark阶段发生变化的引用关系,具体就是young gen有新的对象加入,需要扫描整个young gen,修正引用关系,这个阶段需要STW,CMS最长的停顿时间在这个阶段,young gen越大,停顿时间越长(CMS之前可先跑一次young GC,降低remark阶段停顿时间)。 concurrent sweep阶段:并发清除。 CMS用的是mark sweep算法,会有内存碎片,如果CMS GC之后old gen仍然无法分配,就会启动backup的serial old进行full GC。平时CMS GC old gen跑到一定的容量的时候,也会用serial old跑一次full GC。
点赞 回复 分享
发布于 2017-09-03 21:55
对于初始标记、并发标记、重新标记,我的理解是,初始标记只是JVM标记GC Roots能够直接关联的对象(直接关联应该是直接引用的对象),所以“Stop the world”;并发标记时进行 GC Root Tracing,也就是查看哪些对象是可达的,所以GC线程和用户线程并行运行;重新标记是用来标记在并发标记过程中由于程序运行产生的变动对象,也需要“Stop the world”。
点赞 回复 分享
发布于 2017-09-03 21:16
并发标记期间,用户程序也在运行吖,它有可能会对已经标记过的某些对象的标记记录产生影响,所以要重新标记。 标记清除后,内存不够分配下一个对象的话,会再次触发新的垃圾收集动作吧,再不够的话就OOM。哈哈,个人理解,不知道对不对。
点赞 回复 分享
发布于 2017-09-03 20:53
首先每一种算法都是有其需求的。之所以出现CMS算法,是希望尽可能减少GC过程对正常程序的影响。而这个影响来源于STW(stop the world),因为要清除无用的对象必须要在正常程序对这些对象无操作的情况下进行,否则可能出差错。 所以CMS算法把这个查询过程分了3步,其中第二步(tracing)是最费时间的,为了减少STW,第二步采用并发的模式进行,即不影响正常程序,这也就是为什么CMS算法采用分时标记的原因
点赞 回复 分享
发布于 2017-09-03 21:55
初始标记:把根搜索算法里的根对象标记出来,这个过程是stop the world的。 并发标记:并发的标记从根对象出发能引用到的所有对象,这个过程是不阻塞用户线程的。 再次标记:在并发标记过程中,可能对象的引用状态发生了变化,再检查一遍,这个过程stop the world。 垃圾回收:回收标记为垃圾的对象。 上面是自己的理解,下边是粘的: 根对象: 虚拟机栈(栈帧中的本地变量表)中的引用对象 本地方法栈中引用的对象 方法区中类静态属性引用的对象 方法区中常量引用的对象
点赞 回复 分享
发布于 2017-09-03 21:20
对于第二个问题我的想法是,并发清除后的内存是不规整的,所以在为需要连续存储空间的大对象(数组或很大的字符串)分配空间时,会因为找不到连续的空间而触发一次GC。对于不需要连续存储空间的对象来说,JVM可以使用“空闲列表”来分配内存,所以不会触发GC。
点赞 回复 分享
发布于 2017-09-03 21:01
借楼问一下CMS为什么要有一个初始标记的过程呢,而不是直接并发标记?
点赞 回复 分享
发布于 2017-09-03 20:58

相关推荐

笑死 不是哥们离校了我真要睡街了 加上还有几w的贷款 不接受我准备去当三和大神
梦想是成为七海千秋:没事,hr这下就有底气了,下次遇到一个不接受的就说,你看,人家这学历都接受了,你凭什么不接受
点赞 评论 收藏
分享
04-29 22:35
门头沟学院 Java
牛友说改了名字能收到offer:旧图新发查看图片
点赞 评论 收藏
分享
06-13 17:33
门头沟学院 Java
顺序不记了,大致顺序是这样的,有的相同知识点写分开了1.基本数据类型2.基本数据类型和包装类型的区别3.==和equals区别4.ArrayList与LinkedList区别5.hashmap底层原理,put操作时会发生什么6.说出几种树型数据结构7.B树和B+树区别8.jvm加载类机制9.线程池核心参数10.创建线程池的几种方式11.callable与runnable区别12.线程池怎么回收线程13.redis三剑客14.布隆过滤器原理,不要背八股,说说真正使用时遇到了问题没有(我说没有,不知道该怎么回答了)15.堆的内存结构16.自己在写项目时有没有遇见过oom,如何处理,不要背八股,根据真实经验,我说不会17.redis死锁怎么办,watchdog机制如何发现是否锁过期18.如何避免redis红锁19.一个表性别与年龄如何加索引20.自己的项目的QPS怎么测的,有没有真正遇到大数量表21.说一说泛型22.springboot自动装配原理23.springmvc与springboot区别24.aop使用过嘛?动态代理与静态代理区别25.spring循环依赖怎么解决26.你说用过es,es如何分片,怎么存的数据,1000万条数据怎么写入库中27.你说用limit,那么在数据量大之后,如何优化28.rabbitmq如何批次发送,批量读取,答了延迟队列和线程池,都不对29.计网知不知道smtp协议,不知道写了对不对,完全听懵了30.springcloud知道嘛?只是了解反问1.做什么的?短信服务,信息量能到千万级2.对我的建议,基础不错,但是不要只背八股,多去实际开发中理解。面试官人不错,虽然没露脸,但是中间会引导我回答问题,不会的也只是说对我要求没那么高。面完问我在济宁生活有没有困难,最快什么时候到,让人事给我聊薪资了。下午人事打电话,问我27届的会不会跑路,还在想办法如何使我不跑路,不想扣我薪资等。之后我再联系吧,还挺想去的😭,我真不跑路哥😢附一张河科大幽默大专图,科大就是大专罢了
查看30道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务