使用Concurrent Mark Sweep Collector进行主要垃圾收集?

时间:2014-09-14 11:03:41

标签: java memory-management garbage-collection

我已经通过这个Link得到了一些 关于主要垃圾收集和并行收集器的问题

问题1: -

链接说 “通常主要集合要慢得多,因为它涉及所有活动对象” ,我没有得到如何 处理活动对象使主要收集速度变慢。较小的收集工作混合了无法访问的对象 和活物。

问题2: -

链接说 “主要垃圾收集也是阻止世界事件”

另一方面,它说 “CMS收集器尝试通过与应用程序线程同时执行大部分垃圾收集工作来最小化由于垃圾收集而导致的暂停” CMS收集器也会停止主应用程序线程,直到它完成或与应用程序线程并行运行

问题3: -

当物体从 eden>(Minor GC)surivivor>(Minor GC)老一代移动> (主要GC)>清理旧一代并压缩它。

根据我的理解对象,当对象从surivivor移动到old generation或压缩时,内存位置会发生变化 是完成主要的GC(虽然当它从前面的幸存者空间移动时对象内存位置没有改变)

1 个答案:

答案 0 :(得分:0)

对于并发标记扫描:

  1. 这里的关键词是 all 。 “主要集合要慢得多,因为它涉及所有活动对象。”不仅一次只有几个,而是所有这些。

  2. CMS通常与应用程序同时运行,但是当堆太满或者碎片太多时,整个程序暂停,以便对所有垃圾进行完整的垃圾收集。这真的很慢,因为所有垃圾被收集,但运行速度甚至比你预期的要慢,因为主要集合是单线程。无论您的计算机有多少核心,其中一个核心上只有一个线程可以在主要集合期间为Java做任何工作。

  3. CMS通常不会移动对象,除非在主要集合中。 CMS可以同时运行,因为它所做的只是释放死对象。但是这可能导致很多碎片,如果堆中没有“​​漏洞”足够大,可以创建一个大的新对象,CMS将会停止世界并进行重大收集。部分原因是压缩整个堆,并将堆中的所有对象移动到堆的一端,在堆的另一端创建最大的“漏洞”以进行新的分配。