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。从网上扒一张图,能够看到ide

clipboard[4]

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

从新标记实际上是对并发标记的一个补充修正,由于有些对象在并发标记后,又被释放掉或者又被从新引用,致使以前的标记不许确,从新标记一次。从新标记这个动做的速度是很是快的。接着并发清理时,又是和用户线程同时进行。所以,相比非并发的处理,这种机制有助于减小GC对用户程序的影响。.net

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

相关文章
相关标签/搜索