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实战—8.如何分析jstat统计来定位GC
本文详细介绍了使用jstat、jmap和jhat等工具分析JVM运行状况的方法,以及如何合理优化JVM性能。内容涵盖新生代与老年代对象增长速率、Young GC和Full GC的触发频率及耗时等关键指标的分析。通过模拟BI系统和计算系统的案例,展示了如何根据实际场景调整JVM参数以减少FGC频率,提升系统性能。最后汇总了常见问题及其解决方案,帮助开发者更好地理解和优化JVM运行状态。
JVM实战—8.如何分析jstat统计来定位GC
|
1月前
|
Java 关系型数据库 MySQL
JVM深入原理(六)(二):双亲委派机制
自定义类加载器打破双亲委派机制的方法:复写ClassLoader中的loadClass方法常见问题:要加载的类名如果是以java.开头,则会抛出安全性异常加载自定义的类都会有一个共同的父类Object,需要在代码中交由父类加载器去加载自定义类加载器不手动指定parent会默认指定应用类加载两个自定义类加载器加载同一个类会被认为是两个对象,只有相同的类加载器+想通的类限定名才会被认为是一个对象。
39 0
|
3月前
|
存储 监控 Java
JVM实战—7.如何模拟GC场景并阅读GC日志
本文主要介绍了:如何动手模拟出频繁Young GC的场景、JVM的Young GC日志应该怎么看、编写代码模拟动态年龄判定规则进入老年代、编写代码模拟S区放不下部分进入老年代、JVM的Full GC日志应该怎么看。
132 16
JVM实战—7.如何模拟GC场景并阅读GC日志
|
6月前
|
算法 网络协议 Java
【JVM】——GC垃圾回收机制(图解通俗易懂)
GC垃圾回收,标识出垃圾(计数机制、可达性分析)内存释放机制(标记清除、复制算法、标记整理、分代回收)
|
7月前
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
8月前
|
Java
JVM进阶调优系列(5)CMS回收器通俗演义一文讲透FullGC
本文介绍了JVM中CMS垃圾回收器对Full GC的优化,包括Stop the world的影响、Full GC触发条件、GC过程的四个阶段(初始标记、并发标记、重新标记、并发清理)及并发清理期间的Concurrent mode failure处理,并简述了GC roots的概念及其在GC中的作用。
|
8月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
608 3
|
1月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
207 55
|
2月前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
125 6
|
5月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
797 166