JVM中也有并发GC,CMS机制

简介:

当初看文档的时候,了解到.net CLR中的Background GC机制,它类似于并发GC,当使得在做GC动作是,能够同时进行内存分配。这种机制显著的减少的stop the world这种事情,使得GC的干扰最小化。

当初认为.net这招非常优秀,足以鄙视JAVA,前几天看JVM的书,发现JVM也有类似的机制,但是不叫后台线程,而是称作CMS(Concurrent Mark Sweep)。

从名字就可以看出并发标记清除的意思。CMS机制仅针对老年代上的垃圾(.net的后台GC只在第2代上运行。年轻代上的垃圾由其他回收算法收集),它运行时,分成4个步骤:

初始标记,并发标记,重新标记和最后异步并发清除,其中初始标记和重新标记仍然会stop the world。从网上扒一张图,可以看到

clipboard[4]

初始标记其实就是标记root对象,速度很快,而并发标记,就是顺着root对象的引用链开始顺藤摸瓜的做标记,并发的进行标记,可以看到,此处GC线程和用户线程是同时运行的。

重新标记其实是对并发标记的一个补充修正,因为有些对象在并发标记后,又被释放掉或者又被重新引用,导致之前的标记不准确,重新标记一次。重新标记这个动作的速度是非常快的。接着并发清理时,又是和用户线程同时进行。因此,相比非并发的处理,这种机制有助于减少GC对用户程序的影响。

不过CMS也有缺点,它虽然不会stop the world,但是会占用CPU资源,会拖慢程序。还有一个缺点CMS收集器无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败(至于为什么会出现这种失败,书中也没说的很清楚)。这种失败导致另一次Full GC的产生。这招反而会影响性能。最后一个缺点是大多数标记清除算法共有的缺点,就是在回收后,可能会导致大量的碎片空间,当分配大对象的时候,但碎片太多找不到连续的大空间,也会导致一次Full GC。




















本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/1652596,如需转载请自行联系原作者










相关文章
|
3月前
|
算法 Java
太狠了!阿里技术专家撰写的电子版JVM&G1 GC实战,颠覆了传统认知
JVM是Java语言可以跨平台、保持高发展的根本,没有了 JVM, Java语言将失去运行环境。针对 Java 程序的性能优化一定不可能避免针对JVM 的调优,随着 JVM 的不断发展,我们的应对措施也在不断地跟随、变化,内存的使用逐渐变得越来越复杂。所有高级语言都需要垃圾回收机制的保护,所以 GC 就是这么重要。
|
3月前
|
算法 Java
JVM GC和常见垃圾回收算法
JVM GC和常见垃圾回收算法
48 0
|
26天前
|
存储 缓存 Java
金石原创 |【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系机制(1)
金石原创 |【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系机制(1)
34 1
|
8天前
|
监控 Java 关系型数据库
JVM工作原理与实战(十三):打破双亲委派机制-线程上下文类加载器
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了打破双亲委派机制的方法、线程上下文类加载器等内容。
12 2
|
1月前
|
安全 前端开发 Java
【JVM】双亲委派机制详细解读(通俗易懂)
【JVM】双亲委派机制详细解读(通俗易懂)
103 0
|
2月前
|
算法 Java
深入理解JVM - 解读GC日志
深入理解JVM - 解读GC日志
52 0
|
3月前
|
存储 算法 安全
JVM-并发标记带来问题和解决办法
JVM-并发标记带来问题和解决办法
39 0
|
3月前
|
缓存 安全 前端开发
JVM(类的加载与ClassLoader、双亲委派机制)
JVM(类的加载与ClassLoader、双亲委派机制)
|
3月前
|
前端开发 Java API
JVM 类加载器 双亲委派机制
【1月更文挑战第3天】JVM 类加载器 双亲委派机制
|
3月前
|
算法 Java
JVM GC 垃圾回收
【1月更文挑战第3天】JVM GC 垃圾回收