ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

jvm有哪些垃圾收集器,和实际应用场景

2022-03-01 11:32:21  阅读:176  来源: 互联网

标签:场景 G1 收集器 XX 线程 jvm Serial Parallel


 

上图写了7 种作用于不同分代的收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。 新生代收集器(全部的都是复制算法): Serial ( 串行 ) 、 ParNew ( 多线程 ) 、 Parallel Scavenge (并行处理 ) 老年代收集器: CMS (标记 - 清理)、 Serial Old (标记 - 整理)、 Parallel Old (标记整理) 整堆收集器: G1 (一个 Region 中是标记 - 清除算法, 2 个 Region之间是复制算法)
  同时,先解释几个名词: 1 , 并行( Parallel :多个垃圾收集线程并行工作,此时用户线程处于等待状态 2 , 并发( Concurrent :用户线程和垃圾收集线程同时执行 3 , 吞吐量 :运行用户代码时间/(运行用户代码时间+垃圾回收时间) 1.* *Serial 收集器是最基本的、发展历史最悠久的收集器。 **

特点: 单线程、简单高效(与其他收集器的单线程相比),对于限定单个 CPU 的环境来说, Serial 收集器 由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程手机效率。收集器进行垃圾回收 时,必须暂停其他所有的工作线程,直到它结束( Stop The World )。 应用场景 :适用于 Client模式下的虚拟机。
  2.* *ParNew 收集器其实就是 Serial 收集器的多线程版本。 ** 除了使用多线程外其余行为均和 Serial 收集器一模一样(参数控制、收集算法、 Stop The World 、对象 分配规则、回收策略等)。 特点 :多线程、 ParNew 收集器默认开启的收集线程数与 CPU 的数量相同,在 CPU 非常多的环境中,可以 使用-XX:ParallelGCThreads参数来限制垃圾收集的线程数。 和 Serial 收集器一样存在 Stop The World 问题 应用场景 : ParNew 收集器是许多运行在 Server 模式下的虚拟机中首选的新生代收集器,因为它是除了Serial收集器外,唯一一个能与 CMS 收集器配合工作的。
3.* *Parallel Scavenge 收集器与吞吐量关系密切,故也称为吞吐量优先收集器。 ** 特点 :属于新生代收集器也是采用复制算法的收集器,又是并行的多线程收集器(与 ParNew 收集器类 似)。 该收集器的目标是达到一个可控制的吞吐量。还有一个值得关注的点是: GC 自适应调节策略(与 ParNew 收集器最重要的一个区别) GC 自适应调节策略 : Parallel Scavenge 收集器可设置 -XX:+UseAdptiveSizePolicy 参数。当开关打开时不需要手动指定新生代的大小(-Xmn )、 Eden 与 Survivor 区的比例( -XX:SurvivorRation )、晋升老年代 的对象年龄(-XX:PretenureSizeThreshold )等,虚拟机会根据系统的运行状况收集性能监控信息,动态设置这些参数以提供最优的停顿时间和最高的吞吐量,这种调节方式称为GC 的自适应调节策略。 Parallel Scavenge 收集器使用两个参数控制吞吐量: XX:MaxGCPauseMillis 控制最大的垃圾收集停顿时间 XX:GCRatio 直接设置吞吐量的大小。

4.* *Serial Old 是 Serial 收集器的老年代版本。 **
特点 :同样是单线程收集器,采用标记 - 整理算法。 应用场景 :主要也是使用在 Client 模式下的虚拟机中。也可在 Server 模式下使用。

Server模式下主要的两大用途(后边再补充下··)

5.* *Parallel Old 是 Parallel Scavenge 收集器的老年代版本。 ** 特点 :多线程,采用标记 - 整理算法。 应用场景 :注重高吞吐量以及 CPU 资源敏感的场合,都可以优先考虑 Parallel Scavenge+Parallel Old 收 集器。
  6.* *CMS 收集器是一种以获取最短回收停顿时间为目标的收集器。 ** 特点 :基于标记 - 清除算法实现。并发收集、低停顿。 应用场景 :适用于注重服务的响应速度,希望系统停顿时间最短,给用户带来更好的体验等场景下。如 web程序、 b/s服务。

  7.* *G1 收集器一款面向服务端应用的垃圾收集器。 ** 特点如下: 并行与并发: G1 能充分利用多 CPU 、多核环境下的硬件优势,使用多个 CPU 来缩短 Stop-The-World 停顿 时间。部分收集器原本需要停顿 Java 线程来执行 GC 动作, G1 收集器仍然可以通过并发的方式让 Java 程序 继续运行。 分代收集: G1 能够独自管理整个 Java 堆,并且采用不同的方式去处理新创建的对象和已经存活了一段时 间、熬过多次 GC 的旧对象以获取更好的收集效果。 空间整合: G1 运作期间不会产生空间碎片,收集后能提供规整的可用内存。 可预测的停顿: G1 除了追求低停顿外,还能建立可预测的停顿时间模型。能让使用者明确指定在一个长 度为 M 毫秒的时间段内,消耗在垃圾收集上的时间不得超过 N 毫秒。
** ** 关于gc的选择 除非应用程序有非常严格的暂停时间要求,否则请先运行应用程序并允许 VM 选择收集器(如果没有特别 要求。使用 VM 提供给的默认 GC 就好)。 如有必要,调整堆大小以提高性能。 如果性能仍然不能满足目标,请使用以下准则作为选择收集器的起点: 如果应用程序的数据集较小(最大约 100 MB ),则选择带有选项 -XX : + UseSerialGC 的串行 收集器。 如果应用程序将在单个处理器上运行,并且没有暂停时间要求,则选择带有选项 -XX : + UseSerialGC 的串行收集器。 如果(a)峰值应用程序性能是第一要务,并且(b)没有暂停时间要求或可接受一秒或更长时间的暂停,则让VM 选择收集器或使用 -XX : + UseParallelGC 选择并行收集器 。 c)   如果使用的是 jdk8 ,并且堆内存达到了 16G ,那么推荐使用 G1 收集器,来控制每次垃圾收集 的时间。
这些准则仅提供选择收集器的起点,因为性能取决于堆的大小,应用程序维护的实时数据量以及可用处 理器的数量和速度。 如果推荐的收集器没有达到所需的性能,则首先尝试调整堆和新生代大小以达到所需的目标。 如果性能 仍然不足,尝试使用其他收集器 总体原则 :减少 STOP THE WORD 时间,使用并发收集器(比如 CMS+ParNew , G1 )来减少暂停时间, 加快响应时间,并使用并行收集器来增加多处理器硬件上的总体吞吐量。

标签:场景,G1,收集器,XX,线程,jvm,Serial,Parallel
来源: https://blog.csdn.net/EverWHL/article/details/123201061

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有