首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
编程语言
> 详细
GC算法
时间:
2018-08-23 22:14:24
阅读:
271
评论:
0
收藏:
0
[点我收藏+]
标签:
指定
preview
处理器
释放
完全
最小化
扫描
额外
垃圾
GC算法
JVM提供了4中不同的算法执行GC
The serial garbage collector
串行垃圾收集器是四个中最简单的。 这个是默认收集器
如果应用程序运行在客户端类机器(Windows上的32位JVM或单处理器机)。
串行收集器使用单个线程来处理堆。 它将停止所有应用程序线程在处理堆时(对于minor GC或full GC)。 在full GC期间,它会完全压缩老年代。
串行收集器是系统默认的,通过指定其他GC算法禁用。
The throughput collector
这是服务器类机器的默认收集器(多CPU Unix机器,和任何64位JVM)。
吞吐量收集器使用多个线程来收集年轻代,与使用串行收集器相比,可以更快地 minor GC。 吞吐量collector也可以使用多个线程来处理老年代。
因为它使用多个线程,吞吐量收集器通常称为并行收集器
吞吐量收集器在minor GC和full GC期间停止所有应用程序线程,它在full GC期间完全压缩了老年代
因为它在大多数情况下是默认使用,因此不需要明确启用它。启用 -XX:+UseParallelGC
-XX:+UseParallelOldGC
The CMS collector
CMS收集器旨在消除与吞吐量收集器和串行收集器相关的full GC长暂停。 CMS在minor GC期间停止所有应用程序线程,它也执行多个线程。 但值得注意的是,CMS使用不同的算法收集年轻代(-XX:+ UseParNewGC)比吞吐量收集器使用(-XX:+ UseParallelGC)
CMS不停止应用程序线程在full GC期间,而是使用一个或多个后台线程定期扫描老年代并丢弃未使用的对象。 这使CMS成为低暂停收集器:应用程序线程仅暂停在minor GC期间,以及在某些非常短的时间内后台线程扫描老年代。 应用程序线程停止的总时间远小于吞吐量收集器。
这里的权衡是CPU使用率的增加:必须有足够的CPU可用于后台GC线程扫描堆,在应用程序线程正在运行时。 此外,后台线程不执行任何压缩操作(除了full GC期间),这意味着堆可能变得碎片化。 如果CMS后台线程没有足够的CPU来完成其任务,或者对于分配对象而言堆变为过于分散,CMS将恢复为串行收集器的行为:它会停止所有应用程序线程,以便清理和压缩老年代使用单线程。 然后它再次开始并发后台处理(直到可能,下一次堆变得太碎片了)
如果CMS后台线程在堆填满之前未完成扫描堆并释放对象,CMS将遇到并发模式失败。在那种情况下,CMS必须恢复执行full GC,所有应用程序线程停止。full GC执行只有一个线程,使其成为非常严重的性能损失
启用 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC (默认这2者都是false)
The G1 collector
G1(或Garbage First)收集器旨在处理大堆(大于大约4 GB),暂停时间最短。 它将堆分成许多区域,但它仍然是分代收集器。 其中一些区域包括年轻代,并且仍然通过停止所有应用程序线程来收集年轻代并将所有活着的对象移动到老年代或 survivor 中。 如在其他算法中,这发生使用多个线程。
G1是并发收集器:老年代由后台线程处理不需要停止应用程序线程来执行大部分工作。 因为
老年代分为不同区域,G1可以清理老年代的对象通过从一个区域复制到另一个区域,这意味着它(至少部分地)压缩堆在正常处理期间。 因此,G1堆受碎片影响的可能性要小得多 - 尽管仍有可能。
与CMS一样,避免full GC周期的权衡是CPU时间:多个后台必须有可用的CPU周期在应用程序线程运行时
G1 也可能经历并发模式失败,可能性更小
启用 -XX:+UseG1GC (默认为false)
总结
四种可用的GC算法采用不同的方法最小化GC对应用程序的影响。
串行收集器有意义(并且是默认值)只在一个CPU可用,额外的GC线程会干扰应用程序。
吞吐量收集器是其他机器上的默认值; 它最大化应用程序的总吞吐量,但可能会受到个别操作长时间停顿的影响。
CMS收集器可以并发收集老年代在应用程序线程运行时, 如果对于后台处理有足够的CPU可用,这可以避免full GC周期对应用的影响
G1收集器也并发收集老年代在应用程序线程正在运行时,可能会避免full GC。 它的设计使其更少可能经历 full GC 比起 CMS。
GC算法
标签:
指定
preview
处理器
释放
完全
最小化
扫描
额外
垃圾
原文地址:https://www.cnblogs.com/parkdifferent/p/9526389.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
Spring Cloud 从入门到精通(一)Nacos 服务中心初探
2021-07-29
基础的排序算法
2021-07-29
SpringBoot|常用配置介绍
2021-07-29
关于 .NET 与 JAVA 在 JIT 编译上的一些差异
2021-07-29
C语言常用函数-toupper()将字符转换为大写英文字母函数
2021-07-29
《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)
2021-07-28
4-1 YAML配置文件 注入 JavaBean中
2021-07-28
【python】 用来将对象持久化的 pickle 模块
2021-07-28
马拉车算法
2021-07-28
用Python进行冒泡排序
2021-07-28
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!