赞
踩
上一篇JVM专题十:JVM中的垃圾回收机制专题中,我们主要介绍了Java的垃圾机制,包括垃圾回收基本概念,重点介绍了垃圾回收机制中自动内存管理与垃圾收集算法。如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。本章节就让我具体的垃圾回收器以及他们各自的优缺点,由于垃圾回收器内容比较多,本专题主要讨论分代收集器如:Parallel、ParNew、CMS等,关于G1、ZGC等放到专题十二
如上图所示JVM 的垃圾收集器主要分为两大类:分代收集器和分区收集器,分代收集器的代表是 CMS,分区收集器的代表是 G1 和 ZGC,下面我们来看看各个收集器之间的联系与版本。
Java虚拟机(JVM)中不同版本的垃圾收集器(GC)及其引入的Java Development Kit(JDK)版本的概述。以下是对这些核心内容的整理:
上图提供了JVM垃圾收集器随JDK版本演进的概览,展示了不同收集器的特点和它们被引入的时间点。开发者可以根据这些信息,结合自己的应用需求和JDK版本,选择合适的垃圾收集器。
Serial收集器是Java虚拟机(JVM)中一个非常基础的垃圾收集器,它在JDK 1.3之前是默认的收集器。以下是关于Serial收集器的一些核心信息:
单线程操作:Serial收集器在进行垃圾收集时使用单个线程,这意味着在收集过程中,它不会利用多核处理器的优势。
Stop The World:在Serial收集器进行垃圾收集期间,所有的应用线程会被暂停,直到收集完成。这种停顿被称为"Stop The World",可能会对应用程序性能产生影响,尤其是在垃圾收集周期较长时。
新生代收集:Serial收集器在新生代使用复制(Copying)算法,这是一种简单且高效的算法,适用于新生代,因为新生代中的对象大多是朝生夕死。
老年代收集:Serial Old收集器是Serial收集器的老年代版本,对于老年代,Serial收集器使用标记-整理(Mark-Compact)算法。这种算法首先标记存活的对象,然后整理内存,使得所有存活的对象都移动到内存的一端,从而避免内存碎片。它同样是一个单线程收集器。它主要有两大用途:一种用途是在JDK1.5以及以前的版本中与Parallel Scavenge收集器搭配使用,另一种用途是作为CMS收集器的后备方案。
适用场景:Serial收集器主要适用于单核处理器或者小型应用,以及对延迟不敏感的场景。
配置选项:可以通过JVM参数 -XX:+UseSerialGC
来指定使用Serial收集器进行新生代收集,通过 -XX:+UseSerialOldGC
来指定使用Serial Old收集器进行老年代收集。
性能特点:虽然Serial收集器在现代多核处理器上可能不是最高效的选择,但它的简单性和低资源消耗使其在某些特定场景下仍然有用。
与其他收集器的比较:与并行或并发收集器相比,Serial收集器在多核处理器上的性能可能较差,但在单核系统或资源受限的环境中,它可能是一个合适的选择。
总的来说,Serial收集器是一个简单且历史悠久的垃圾收集器,虽然在现代应用中可能不是首选,但在特定的低资源环境中,它仍然有其用武之地。随着JVM的发展,更多的高级收集器被引入,以满足不同应用场景的需求。
Parallel收集器其实就是Serial收集器的多线程版本,除了使用多线程进行垃圾收集外,其余行为控制参数、收集算法、回收策略等等和Serial收集器类似。关于Parallel收集器及其变体的核心信息概述如下:
-XX:ParallelGCThreads
指定。这些收集器适用于需要高吞吐量的应用,尤其是在多核处理器环境中,通过参数配置可以实现高效的垃圾收集。
ParNew收集器作为Serial收集器的多线程版本,与Parallel收集器在很多方面相似,但它们之间存在一些关键的差异和特定的使用场景。以下是ParNew收集器的核心信息:
多线程支持:ParNew收集器使用多个线程进行垃圾收集,与Parallel收集器类似,可以充分利用多核处理器的优势。
与CMS的兼容性:ParNew收集器的主要特点是它可以与CMS(Concurrent Mark Sweep)收集器配合使用。CMS是一种并发收集器,主要关注减少垃圾收集期间的用户线程停顿时间。
新生代收集:ParNew收集器在新生代使用复制算法,这是一种简单且高效的算法,适用于新生代,因为新生代中的对象大多是朝生夕死。
Server模式下的默认选择:在Server模式下,ParNew收集器通常是首选,特别是当应用需要与CMS收集器配合工作时。
适用场景:ParNew收集器适用于需要快速响应垃圾收集需求的多核服务器环境,尤其是在与CMS收集器结合使用时,可以提供较低的停顿时间。
配置选项:可以通过JVM参数-XX:+UseParNewGC
来指定使用ParNew收集器进行新生代收集。
ParNew收集器的优势在于它能够与CMS收集器协同工作,提供一种平衡吞吐量和停顿时间的解决方案。这种组合特别适合那些需要高吞吐量同时又希望减少垃圾收集引起的停顿的应用场景。然而,开发者需要根据具体的应用需求和性能目标来决定是否使用ParNew与CMS的组合,或者选择其他的垃圾收集器配置。
CMS(Concurrent Mark Sweep)收集器是一种以减少垃圾收集(GC)过程中的停顿时间为目标的垃圾收集策略。以下是CMS收集器的详细概述,包括其优点和缺点:
CMS收集器概述:
运作过程:
CMS收集器优点:
CMS收集器缺点:
其他注意事项:
CMS收集器的设计目标是减少GC引起的停顿时间,通过并发执行大部分GC工作来实现这一目标。然而,它也有一些局限性,如对CPU资源的敏感性、浮动垃圾问题和空间碎片问题。开发者需要根据应用的具体需求和运行环境来决定是否使用CMS收集器,并进行适当的参数调整以优化性能。
CMS(Concurrent Mark Sweep)收集器的一些核心参数,它们可以用于调整和优化CMS收集器的行为:
-XX:+UseConcMarkSweepGC
:启用CMS垃圾收集器。
-XX:ConcGCThreads
:设置并发GC线程的数量,即在并发标记和并发清理阶段使用的线程数。
-XX:+UseCMSCompactAtFullCollection
:在Full GC之后执行内存压缩整理,以减少内存碎片。
-XX:CMSFullGCsBeforeCompaction
:设置在多少次Full GC之后执行一次压缩整理,默认值为0,意味着每次Full GC后都会进行压缩整理。
-XX:CMSInitiatingOccupancyFraction
:设置老年代占用达到该比例时触发Full GC的阈值,默认为92%。
-XX:+UseCMSInitiatingOccupancyOnly
:仅使用-XX:CMSInitiatingOccupancyFraction
设置的回收阈值。如果不设置此参数,JVM在第一次使用设定值后,后续会根据实际情况自动调整阈值。
-XX:+CMSScavengeBeforeRemark
:在CMS GC的重新标记阶段前启动一次Minor GC,减少标记阶段的开销。由于CMS GC的大部分耗时通常在标记阶段,此参数可以提高效率。
-XX:+CMSParallellnitialMarkEnabled
:在初始标记阶段使用多线程执行,以缩短停顿时间。
-XX:+CMSParallelRemarkEnabled
:在重新标记阶段使用多线程执行,进一步缩短停顿时间。
通过调整这些参数,开发者可以根据应用的具体需求和运行环境来优化CMS收集器的性能。例如,如果应用对停顿时间非常敏感,可以增加并发GC线程数或调整触发Full GC的阈值。如果内存碎片是一个问题,可以启用内存压缩整理。这些参数提供了灵活性,使得CMS收集器可以适应不同的应用场景。
三色标记算法是现代垃圾收集器中用于解决并发标记问题的一种算法。以下是三色标记算法的详细解释:
三色标记算法概述:
算法步骤:
优点:
缺点:
应用:
增量更新:
三色标记算法通过区分已访问和未访问的对象,有效地避免了在并发标记期间由于对象引用变化导致的漏标问题。这种算法是实现低延迟垃圾收集的关键技术之一。
其实章节最最主要的还是要掌握CMS相关知识掉。目前用的最多的就是他了,同时你们也可以看下自己产线用的是什么收集器。和相关参数怎么配置的,为什么这么配置根据是什么。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。