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月前
|
Arthas 监控 Java
(十一)JVM成神路之性能调优篇:GC调优、Arthas工具详解及各场景下线上最佳配置推荐
“在当前的互联网开发模式下,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代开发过程中炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题”。
258 3
|
2月前
|
安全 前端开发 Java
【JVM的秘密揭秘】深入理解类加载器与双亲委派机制的奥秘!
【8月更文挑战第25天】在Java技术栈中,深入理解JVM类加载机制及其双亲委派模型是至关重要的。JVM类加载器作为运行时系统的关键组件,负责将字节码文件加载至内存并转换为可执行的数据结构。其采用层级结构,包括引导、扩展、应用及用户自定义类加载器,通过双亲委派机制协同工作,确保Java核心库的安全性与稳定性。本文通过解析类加载器的分类、双亲委派机制原理及示例代码,帮助读者全面掌握这一核心概念,为开发更安全高效的Java应用程序奠定基础。
83 0
|
3天前
|
存储 Java PHP
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
15 0
|
25天前
|
Arthas Java 测试技术
JVM —— 类加载器的分类,双亲委派机制
类加载器的分类,双亲委派机制:启动类加载器、扩展类加载器、应用程序类加载器、自定义类加载器;JDK8及之前的版本,JDK9之后的版本;什么是双亲委派模型,双亲委派模型的作用,如何打破双亲委派机制
JVM —— 类加载器的分类,双亲委派机制
|
2月前
|
开发者 C# Windows
WPF布局大揭秘:掌握布局技巧,轻松创建响应式用户界面,让你的应用程序更上一层楼!
【8月更文挑战第31天】在现代软件开发中,响应式用户界面至关重要。WPF(Windows Presentation Foundation)作为.NET框架的一部分,提供了丰富的布局控件和机制,便于创建可自动调整的UI。本文介绍WPF布局的基础概念与实现方法,包括`StackPanel`、`DockPanel`、`Grid`等控件的使用,并通过示例代码展示如何构建响应式布局。了解这些技巧有助于开发者优化用户体验,适应不同设备和屏幕尺寸。
33 0
|
2月前
|
算法 Java 应用服务中间件
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
|
2月前
|
存储 监控 算法
深入解析JVM内部结构及GC机制的实战应用
深入解析JVM内部结构及GC机制的实战应用
|
2月前
|
Java Docker 索引
记录一次索引未建立、继而引发一系列的问题、包含索引创建失败、虚拟机中JVM虚拟机内存满的情况
这篇文章记录了作者在分布式微服务项目中遇到的一系列问题,起因是商品服务检索接口测试失败,原因是Elasticsearch索引未找到。文章详细描述了解决过程中遇到的几个关键问题:分词器的安装、Elasticsearch内存溢出的处理,以及最终成功创建`gulimall_product`索引的步骤。作者还分享了使用Postman测试接口的经历,并强调了问题解决过程中遇到的挑战和所花费的时间。
|
3天前
|
存储 Java Linux
【JVM】JVM执行流程和内存区域划分
【JVM】JVM执行流程和内存区域划分
16 1
|
4天前
|
存储 安全 Java
JVM锁的膨胀过程与锁内存变化解析
在Java虚拟机(JVM)中,锁机制是确保多线程环境下数据一致性和线程安全的重要手段。随着线程对共享资源的竞争程度不同,JVM中的锁会经历从低级到高级的膨胀过程,以适应不同的并发场景。本文将深入探讨JVM锁的膨胀过程,以及锁在内存中的变化。
10 1