首页 > 试题广场 >

CMS垃圾回收器在那些阶段是没用用户线程参与的

[不定项选择题]
CMS垃圾回收器在那些阶段是没用用户线程参与的
  • 初始标记
  • 并发标记
  • 重新标记
  • 并发清理
CMS全称 Concurrent Mark Sweep,是一款并发的、使用标记-清除算法的垃圾回收器,以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器,对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。
CMS的基础算法是:标记—清除。
它的过程可以分为以下6个步骤:
  1. 初始标记(STW initial mark)
  2. 并发标记(Concurrent marking)
  3. 并发预清理(Concurrent precleaning)
  4. 重新标记(STW remark)
  5. 并发清理(Concurrent sweeping)
  6. 并发重置(Concurrent reset)

  1. 初始标记:在这个阶段,需要虚拟机停顿正在执行的任务,官方的叫法STW(Stop The Word)。这个过程从垃圾回收的"根对象"开始,只扫描到能够和"根对象"直接关联的对象,并作标记。所以这个过程虽然暂停了整个JVM,但是很快就完成了
  2. 并发标记:这个阶段紧随初始标记阶段,在初始标记的基础上继续向下追溯标记。并发标记阶段,应用程序的线程和并发标记的线程并发执行,所以用户不会感受到停顿
  3. 并发预清理:并发预清理阶段仍然是并发的。在这个阶段,虚拟机查找在执行并发标记阶段新进入老年代的对象(可能会有一些对象从新生代晋升到老年代, 或者有一些对象被分配到老年代)。通过重新扫描,减少下一个阶段"重新标记"的工作,因为下一个阶段会Stop The World。
  4. 重新标记:这个阶段会暂停虚拟机,收集器线程扫描在CMS堆中剩余的对象。扫描从"根对象"开始向下追溯,并处理对象关联。
  5. 并发清理:清理垃圾对象,这个阶段收集器线程和应用程序线程并发执行
  6. 并发重置:这个阶段,重置CMS收集器的数据结构,等待下一次垃圾回收。
        CMS不会整理、压缩堆空间,这样就带来一个问题:经过CMS收集的堆会产生空间碎片,CMS不对堆空间整理压缩节约了垃圾回收的停顿时间,但也带来的堆空间的浪费。
        为了解决堆空间浪费问题,CMS回收器不再采用简单的指针指向一块可用堆空 间来为下次对象分配使用。;而是把一些未分配的空间汇总成一个列表,当JVM分配对象空间的时候,会搜索这个列表找到足够大的空间来hold住这个对象。
        从上面的图可以看到,为了让应用程序不停顿,CMS线程和应用程序线程并发执行,这样就需要有更多的CPU,单纯靠线程切 换是不靠谱的。并且,重新标记阶段,为空保证STW快速完成,也要用到更多的甚至所有的CPU资源。
        B.并发标记 和 D.并发清理 这两个阶段是有用户线程参与的,所以答案选A和C。
发表于 2020-05-02 22:17:52 回复(41)
用户线程(user-level threads)指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。
CMS的GC过程有6个阶段(4个并发,2个暂停其它应用程序)
1. 初次标记(STW initial mark)
2. 并发标记(Concurrent marking)
3. 并发可中断预清理(Concurrent precleaning)
4. 最终重新标记(STW remark)
5. 并发清理(Concurrent sweeping)
6. 并发重置(Concurrent reset)
在初次标记,重新标志的时候,要求我们暂停其它应用程序,那么这两个阶段用户线程是不会参与的
编辑于 2019-09-03 14:30:37 回复(5)
选了B,D,完美。。。。
发表于 2019-04-10 16:26:21 回复(18)
完美避开所有正确答案
发表于 2019-08-21 13:13:43 回复(6)

CMS的GC过程:

1.初始标记:暂停用户线程,对引用进行遍历并标记;

2. 并发标记:在并发情况下,遍历除1中标记过的线程并标记;

3. 并发预清理:并发情况下对以上的标记进行清理;

4. 重标记:由于3过程是并发的,可能会产生一些引用,所以需要暂停用户线程重新标记;

5. 并发清理:清理4过程产生的标记;

6. 并发重置:做一些收尾工作。

发表于 2019-12-22 13:42:29 回复(1)
初始标记和重新标记会“stop the word”,所以和用户线程无关
发表于 2019-08-25 20:50:11 回复(0)
我只想知道这个垃圾回收是在哪儿学的
发表于 2019-08-26 00:37:16 回复(4)
带并发的都是与用户线程一起执行的
发表于 2020-08-12 22:47:32 回复(0)
个人理解,并发会用到线程,所以直接排除😂
发表于 2019-08-26 07:52:05 回复(2)

如下图

发表于 2020-04-18 08:26:50 回复(0)
看来做这题得反着来
发表于 2022-02-25 17:02:22 回复(0)
CMS收集器是一种以回收最短回收停顿时间为目标的垃圾收集器。CMS收集器是基于“标记——清除”算法实现的,整个过程分为4个步骤:
1.初始标记 2.并发标记 3.重新标记 4.并发清除
初始标记仅仅标记一下GC Roots能直接关联到的对象,速度很快,并发标记阶段就是进行GC Roots Tracing的过程,而重新标记阶段则是为了并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,整个过程中耗时最长的并发标记与并发清除过程收集器线程可以与用户线程一起工作。选A.C


编辑于 2020-02-03 13:34:50 回复(0)
当cms执行时,初始标记和重新标记会暂停虚拟机,所以不会有用户线程参与
发表于 2021-06-14 11:26:47 回复(0)
题目太不严谨,任何情况都没有用户线程参与,因为垃圾回收是垃圾回收线程的责任,跟用户线程有半毛钱关系?题目不是这样表述的
发表于 2020-03-13 08:56:20 回复(1)
完美避开
发表于 2019-11-28 17:39:49 回复(0)
我选了abcd,成功包含了正确答案
发表于 2019-08-28 23:21:32 回复(1)
这是哪里的知识,看着好想死啊
发表于 2023-06-03 18:41:52 回复(0)
这种东西在工作中有用吗?有什么场景会用到这些知识?
发表于 2020-04-02 21:57:50 回复(2)
初始和重新 看到这种题目  一整个害怕
发表于 2022-11-28 14:35:00 回复(0)
cms (concurrent - mark - sweep  并发标记清除收集器),第一次实现了让gc线程和用户线程同时工作的收集器。

四个阶段:
1. 初始标记  stw
    首先所有的用户线程都会短暂暂停,由gc线程进行简单的标记与gcroots直接关联的对象。 这个阶段耗时很短。

2. 并发标记
    都并发了,那肯定设计到多个线程------gc线程和用户线程同时工作去标记整个图上由gcroots关联到的所有对象。 耗时较久。

3. 重新标记 stw
    校正完善第二阶段的结果。 耗时比2短不少

4. 并发清除
    gc线程和用户线程,同时清理死亡对象。
    
    
最后看下答案:没有用户线程参加的阶段。  反过来看,有并发的都有用户线程参与,排除就好。ac

发表于 2022-09-07 10:21:44 回复(0)