Java 使用并发标记清除收集器的主要垃圾收集?

Java 使用并发标记清除收集器的主要垃圾收集?,java,memory-management,garbage-collection,Java,Memory Management,Garbage Collection,我已经检查过了,得到了一些 关于主要垃圾收集和并行收集器的问题 问题1:- Link说,“通常一个主要的收藏速度要慢得多,因为它涉及所有的活动对象”,我不知道怎么做 处理活动对象会使主收集速度慢于处理无法访问对象的混合的次收集 和活的物体 问题2:- Link说“主要的垃圾收集也会阻止世界事件” 另一方面,它说 “CMS收集器通过与应用程序线程同时执行大部分垃圾收集工作,尝试最小化垃圾收集引起的暂停” 那么,CMS收集器是否会停止主应用程序线程,直到它完成或与应用程序线程并发运行 问题3:- 当

我已经检查过了,得到了一些 关于主要垃圾收集和并行收集器的问题

问题1:-

Link说,“通常一个主要的收藏速度要慢得多,因为它涉及所有的活动对象”,我不知道怎么做 处理活动对象会使主收集速度慢于处理无法访问对象的混合的次收集 和活的物体

问题2:-

Link说“主要的垃圾收集也会阻止世界事件”

另一方面,它说 “CMS收集器通过与应用程序线程同时执行大部分垃圾收集工作,尝试最小化垃圾收集引起的暂停” 那么,CMS收集器是否会停止主应用程序线程,直到它完成或与应用程序线程并发运行

问题3:-

当这些对象从伊甸园移动时(小GC)surivivor>(小GC)老一代>(大GC)>清理老一代并将其压缩。

根据我的理解,当对象从生存移动到老一代或压缩时,对象内存位置会发生变化
完成主要GC(尽管对象内存位置在从伊甸园移动到幸存者空间时不会更改)

对于并发标记扫描:

  • 这里的关键词是全部。“一个主要的收集要慢得多,因为它涉及所有的活动对象。”不是一次只收集几个,而是全部收集

  • CMS通常与应用程序同时运行,但当堆太满或碎片太多时,整个程序将暂停,以便对所有垃圾进行完全垃圾收集。这真的很慢,因为所有的垃圾都被收集了,但是运行的速度比您预期的还要慢,因为主要的收集是单线程的。无论您的机器有多少个内核,在主要收集过程中,其中一个内核上只有一个线程可以为Java做任何工作

  • CMS通常不会移动对象,除非在主要收集期间。CMS可以并发运行,因为它所做的只是释放死对象。但这可能会导致大量碎片,如果堆中没有足够大的“洞”来容纳正在创建的大型新对象,CMS将停止世界并进行主要收集。其中一部分是压缩整个堆,并将堆中的所有对象移动到堆的一端,使堆的另一端最大的“洞”可能用于新的分配

  • 就我个人而言,这本书非常全面,应该能回答你所有的问题。