Virgo level
获赞
858
粉丝
23
关注
9
看过 TA
17
山东师范大学
2018
Java
IP属地:山东
但行好事,莫问前程。
私信
关注
2017-09-03 21:01
已编辑
山东师范大学 Java
当并发标记完之后要进行重新标记。那么并发标记的意义是什么?直接重新标记不就完了? 还有标记清除算法。如果清除后剩余的存活对象之间连续的内存不够分配给下一个对象,会OOM吗? CMS为什么要有一个初始标记的过程呢,而不是直接并发标记? 求解惑,谢谢。
GDUT_SD:首先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。
0 点赞 评论 收藏
分享
2017-08-30 18:21
已编辑
山东师范大学 Java
Bootstrap classLoader并不属于JVM的等级层次,它不遵守ClassLoader的加载规则,Bootstrap classLoader并没有子类。 (一)那么Classloader的加载规则是啥?是双亲委托模式吗? 而ClassLoader是通过双亲委托模式来加载我们的class,就是先通过父类的ClassLoader来加载我们的class,如果父类加载失败,则通过我们的子ClassLoader来加载我们的class。 (二)关于双亲委托模式,就这么一句话??????????
牛客9081489号:双亲委派模型,是这优先让父类加载,如果父类加载不了,再往下传。 所以所有的类都会首先判断启动加载器能不能加载,然后往下传。 这样的方式保证了java类加载的稳定。 虽然启动类加载器不是扩招类加载器的父类,但是我觉得可以认为是。 以上是我读深入理解jvm的一些理解,如果不对,欢迎指正。
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务