堆内存结构
引言
垃圾收集器就是垃圾收集算法的具体实现。HotSpot7种不同分代的收集器彼此之间可能搭配使用。
Serial收集器
该收集器是单线程收集器即串行收集器,并不是说它只使用一条收集线程,而是说它收集垃圾时必须停掉其他的工作线程直到收集结束。
优点是简单高效停掉其他线程没有线程交互的开销专心做着收集工作。
缺点是它必须停掉其他工作线程会有一个停顿时间。
ParNew收集器
ParNew收集器是Serial收集器的多线程版本即并行收集器,除了多线程收集外和Serial收集器基本一样。CMS收集器回收新生代时只能配合前两者收集器。
优点是多CPU环境中它默认开启的线程数和CPU数相同。
缺点是单CPU环境中考虑到线程交互的开销性能没有Serial收集器高。
并行:指多条收集线程并行工作但用户线程仍处于等待状态。
并发:指收集线程和用户线程并行执行或交替执行
Parallel Scavenge并行收集器
该收集器和前几个收集器一样都是新生代收集器而且是并行收集器,看上去和ParNew收集器差不多。该收集器的侧重点和其他收集器不同,其他收集器侧重的是缩短停顿时间该收集器侧重的是达到一个可控制的吞吐量。吞吐量 = 运行用户代码时间 / ( 运行用户代码时间 + 垃圾回收时间 )。
该收集器提供两个参数用于精确控制吞吐量。最大停顿时间(-XX:MaxGCPauseMillis)和吞吐量大小(-XX:GCTimeRatio默认值99即1%)。
该收集器还有一个参数 -XX:UseAdaptiveSizePolicy,这是一个开关参数,打开后只需设置停顿时间或吞吐量参数为虚拟机设定一个优化目标,虚拟机会自动调节。
Serial Old收集器
该收集器是一个老年代收集器且是串行收集器。两个用途,一个是配合Parallel Scavenge收集器使用,另一个是做CMS收集器的后备预案使用应对CMS预留老年代空间不足导致的“Concurrent Model Failure”失败。
Parallel Old收集器
Parallel Scavenge收集器和Parallel Old收集器组合实现“吞吐量优先”,在注重吞吐量和CPU资源敏感时可以使用。
CMS收集器
全称为Concurrent Mark Sweep,并发标记清除收集器。该收集器是基于“标记-清除”算法实现的。
收集过程分为四步:初始标记,并发标记,重新标记,并发清除。
初始标记和重新标记都需要Stop The World,初始标记是标记GC Roots能关联到的对象速度快,并发标记是寻找引用链较耗时,重新标记是为了修正并发标志期间用户线程使初始标记发生改变的那部分标志记录比初始标记耗时但远没有并发标记耗时,并发清理是并发的。
优点是并发收集低停顿。
缺点是对CPU资源敏感,无法处理浮动垃圾出现“Concurrent Model Failure”失败导致另一次Full GC,标记-清除算法的固有缺点(空间碎片化)。
G1收集器
优势是并行与并发、分代收集、空间整理、可预测的停顿。
收集过程分为:初始标记,并发标记,最终标记,筛选回收。
初始标记是标记GC Roots能关联到的对象需要停顿线程但耗时很短,并发标记是以GC Roots为起始点向下搜索做可达性分析找出存活对象较耗时,最终标记是为了修正并发标志期间用户线程使初始标记发生改变的那部分标志记录需要停顿线程,筛选回收停顿用户线程提高收集效率。
常用参数
参数 |
描述 |
UseSerialGC |
虚拟机运行在Client模式下的默认值,打开时使Serial+Serial Old组合收集 |
UseParNewGC |
打开时使ParNew+Serial Old组合收集 |
UseConcMarkSweepGC |
|
UseParallelGC |
|
打开时使用Parallel Scavenge+Parallel Old组合收集 |
|
SurvivorRatio |
新生代Eden区域和Survivor区域的容量比,默认为8 |
PretenureSizeThreshold |
大于该参数值的对象直接进入老年代 |
MaxTenuringThreshold |
晋升到老年代的对象年龄参数,经过一次Minor GC的对象年龄加1,大于该参数时晋升到老年代 |
UseAdaptiveSizePolicy |
动态调整Java堆中各区域大小和进入老年代的年龄 |
HandlePromotionFailure |
是否允许分配担保失败, |
ParallelGCThreads |
并行回收时的线程数 |
GCTimeRatio |
GC时间占总时间比例,默认99,仅使用Parallel Scavenge时生效 |
MaxGCPauseMillis |
GC最大停顿时间,仅使用Parallel Scavenge时生效 |
CMSInitiatingOccupancyFraction |
CMS在老年代内存使用多少之后触发GC,默认68%,仅使用CMS时生效 |
UseCMSCompactAtFullCollection |
CMS垃圾回收后是否进行一次内存碎片整理,仅使用CMS时生效 |
CMSFullGCsBeforeCompaction |
CMS若干次垃圾回收后再启动一次内存碎片整理,仅使用CMS时生效 |