网站建设初稿哪家建站好
news/
2025/9/22 21:04:26/
文章来源:
网站建设初稿,哪家建站好,做网站需要后端吗,dedecms网站怎么搬家初始标记
需要暂停所有的其他线程#xff0c;但这个阶段会很快完成。它的目的是标记所有的根对象#xff0c;以及被根对象直接引用的对象#xff0c;以及年轻代指向老年代的对象#xff0c;不会遍历对象关系#xff0c;单线程执行。
并发标记阶段
不需要暂停应用线程但这个阶段会很快完成。它的目的是标记所有的根对象以及被根对象直接引用的对象以及年轻代指向老年代的对象不会遍历对象关系单线程执行。
并发标记阶段
不需要暂停应用线程遍历对象图标记可达对象。 可能产生漏标记的问题会导致本该存活的对象被回收。如何解决这个问题 在老年代对象引用关系改变的时候把该对象所在的卡页标记为脏页通过写屏障维护卡表后续只需要扫描脏页而不是整个老年代。这个是CMS解决并发标记漏标的具体实现方案。
并发预处理阶段
不需要暂停应用线程。 会扫描脏页的对象并遍历标记然后清除脏标记。
可取消的并发预处理
为什么在可取消的并发预处理进行一次年轻代GC能减轻最终标记的工作 如果一直没等到Minor GC这个时候进行最终标记的话可能会发生连续停顿假设重新标记的时候新生代发生了Minor GCSTW最终标记又是STW的因此可能会发生连续停顿。
CMS提供了参数CMSScavengeBeforeRemark使最终标记前强制进行一次Minor GC。
这个参数有利有弊利是降低了Remark阶段的停顿时间弊的是在新生代对象很少的情况下也多了一次YGC哪怕在可取消的并发预处理阶段已经发生了一次YGC然后在该阶段又会去傻傻的触发一次。
重新标记
不暂停应用程序。因为它循环做同样的事情直到满足某个退出条件。 1.处理 From 和 To 区的对象标记可达的老年代对象。 2.和上一个阶段一样扫描处理Dirty Card中的对象。
在重新标记Remark阶段实际上是要扫描整个堆内存的包括新生代和老年代。
这是因为在并发标记阶段应用程序线程还在运行可能会有新对象被分配到新生代并且可能会有引用关系的改变。如果不扫描新生代就可能会漏掉一些被引用的对象导致误删。
但是实际上由于各种优化技术比如增量更新Incremental Update和卡表(Card Table)重新标记阶段可以只扫描部分区域。例如只需要扫描在并发标记阶段中被修改过的那部分堆内存区域而无需全盘扫描整个堆内存。
年轻代的扫描可以使用卡表就是用上记录老年代到年轻代引用关系的卡表
重新标记也是可以并发执行的。
可以通过-XX:ParallelRemarkEnabled参数启用并行重新标记它允许在重新标记阶段使用多线程。
请注意这个选项不影响初始标记阶段那个阶段仍将使用单线程执行。
启用-XX:ParallelRemarkEnabled参数并行执行CMS的重新标记阶段可以减少垃圾回收时应用的停止时间但也有可能带来一些缺点
资源消耗并行执行需要更多的CPU资源如果系统上运行着其他需要CPU的任务这可能会降低它们的性能。 复杂性增加并行化处理通常增加了系统的复杂性可能会导致更难预测和调试的性能问题。 不稳定性尽管并行重新标记通常可以提高效率但在某些特定硬件和工作负载下可能会得到相反的结果。 因此是否使用-XX:ParallelRemarkEnabled取决于具体的应用和硬件环境。在开启这个选项之前最好先在仿真环境中进行充分的测试以评估它对性能的影响。
并发清除
最后是并发清除阶段在此阶段中垃圾回收器删除未被标记的对象并回收他们占用的内存空间同样该步骤也是与应用线程并发执行的。
这个过程还是有可能用户线程在不断产生垃圾但只能留到下一次GC 进行处理了产生的这些垃圾被叫做浮动垃圾。
CMS使用空闲列表free-list在并发清除阶段结束后CMS会将未被标记的内存即垃圾对象占据的内存收集起来组成一个空闲列表。
这个空闲列表保存了可用于新对象分配的内存块信息。当需要分配新对象时JVM可以直接从空闲列表中找到合适大小的内存块进行分配而无需进行完整的垃圾回收。
但是这种方法也有其缺点例如可能会导致内存碎片化问题。如果连续的空闲内存块不足以满足新的内存请求就需要触发一次完全的垃圾收集此时则可能会引起较长时间的暂停。
缺点
1.CMS垃圾收集器是处理器资源敏感的。在并发阶段它不会导致用户线程停顿但会占用一部分线程或者说处理器的计算能力来进行垃圾回收从而导致应用程序变慢降低总吞吐量。低延迟和高吞吐往往无法同时达成低延迟有时是牺牲高吞吐换得的。 CMS 回收线程数量可以通过-XX:ParallelCMSThreads这个JVM参数来设定。
2.无法处理浮动垃圾。并发清理阶段用户线程是还在继续运行的程序在运行自然就还会伴随有新的垃圾对象不断产生。CMS无法在当次收集中处理掉它们只能下一次垃圾回收来处理。
3.在垃圾收集阶段用户线程还需要持续运行那就还需要预留足够内存空间提供给用户线程使用因此CMS收集器不能像其他收集器那样等待到老年代几乎完全被填满了再进行收集。可以通过 -XX:CMSInitiatingOccupancyFraction 参数自行调节进行CMS回收的内存阈值。
如果CMS运行期间预留的内存无法满足程序分配新对象的需要就会出现一次并发失败Concurrent Mode Failure。会触发触发STW临时启用Serial Old收集器来重新进行老年代的垃圾收集但这样停顿时间就很长了。Serial Old使用的是标记-整理Mark-Compact算法。
4.内存碎片可能导致Full GC。 空间碎片过多时将会给大对象分配带来很大麻烦往往会出现老年代还有很多剩余空间但就是无法找到足够大的连续空间来分配当前对象而不得不提前触发一次Full GC的情况。 CMS收集器提供了一个-XXUseCMS-CompactAtFullCollection用于在CMS收集器不得不进行Full GC时开启内存碎片的合并整理过程但是整理过程又必须移动存活对象这样空间碎片问题是解决了但停顿时间又会变长。
另外一个参数-XXCMSFullGCsBefore-Compaction这个参数的作用是要求CMS收集器在执行过若干次数量由参数值决定不整理空间的Full GC之后下一次进入Full GC前会先进行碎片整理。虽然内存压缩可以减少内存碎片提高内存利用效率但同时也会增加GC的暂停时间。
问题
1.Full GC指的是什么 CMS GC是指老年代的GC而Full GC指的是整个堆的GC事件包括新生代、老年代、元空间等
参考
CMS CMS
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910369.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!