分类 | 垃圾回收器类型 |
---|---|
线程数 | 串行垃圾回收 |
并行垃圾回收 | |
工做模式 | 并发垃圾回收 |
独占垃圾回收 | |
碎片算法 | 压缩垃圾回收 |
非压缩垃圾回收 | |
分代 | 新生代垃圾回收 |
老年代垃圾回收 |
指在应用程序的生命周期内,应用程序所花费的时间和系统总运行时间的比值
系统总运行时间=程序耗时+GC耗时
若是系统运行了100min,gc运行了1min,那么系统的吞吐量就是(100-1)/100=99%算法
和吞吐量想法,垃圾负载是指回收器耗时与系统运行总时间的比值服务器
指垃圾回收器正在运行时,应用程序的暂停时间。对于独立回收器而言,停顿时间可能会比较长。多线程
回收频率指回收器多长时间会运行一次。通常来讲,固定程序的频率越低越好。并发
当一个对象称为垃圾对象以后,多长时间,它占据的内存会被释放性能
一般状况下,很难让一个程序在全部指标上都达到最优,只能根据程序特色,尽量让GC配合程序而工做spa
Serial收集器 是最古老,实现简单,逻辑高效,JVM默认的一款收集器.net
- | - |
---|---|
线程数 | 串行单线程 |
工做模式 | 独占式 |
分代 | 新生代,老年代 |
碎片处理 | 新生代: 复制算法. 老年代:标记压缩算法 |
GC 参数 | -XX:+UseSerialGC |
串行的工做模式会致使较长的应用程序的停顿时间 线程
ParNew收集器是针对新生代并行的收集器。设计
- | - |
---|---|
线程数 | 并行多线程 |
工做模式 | 独占式 |
分代 | 新生代 |
碎片处理 | 复制算法 |
GC 参数 | -XX:UseParNewGC |
并行的工做模型是指 GC的线程在同一时刻同时运行,和应用程序仍是串行的模式,因此也仍是会和应用程序去争夺CPU资源,当GC分配到资源后 会形成短暂的程序停顿,可是同时也会下降吞吐量 code
Paralle Scavenge 收集器 和 ParNew 收集器相似。区别在于Paralle Scavenge 收集器
重点关注 程序吞吐量。有时,这个收集器也被叫为吞吐量优先 收集器
- | - |
---|---|
线程数 | 并行多线程 |
工做模式 | 独占式 |
分代 | 新生代 |
碎片处理 | 复制算法 |
GC 参数 | -XX:UseParallelGC -XX:MaxGCPauseMillis 设置最大停顿时间 -XX:GCTimeRatio 设置吞吐量 默认是99 GC时间=1/(1+99)=1% |
Serial Old收集器是 Serial 收集器老版本 针对 老年代使用。已被Serial收集器取代。
多树 是和Parallel Scavenge 组合使用
- | - |
---|---|
线程数 | 串行单线程 |
工做模式 | 独占式 |
分代 | 老年代 |
碎片处理 | 标记压缩 |
GC 参数 | -XX:UseSerialOldGC |
Paraell Old 收集器是针对老年代并行的收集器。
- | - |
---|---|
线程数 | 并行多线程 |
工做模式 | 非独占式 |
分代 | 老年代 |
碎片处理 | 标记清理 |
GC 参数 | -XX:UseParallelOldGC -XX:ParallelGCThreads 并行线程的数量 |
Concurrent Mark Sweep
CMS 是一个单纯的老年收集器 采用Mark-Sweep算法,主要关注与停顿时间。它采用非独占式的并发模式,能够和应用程序同时执行,因此总的来讲 停顿时间较少
运行过程比较复杂,在标记,清除的不一样阶段,它会尝试与应用程序同时进行。
–初始标记
•根能够直接关联到的对象
•速度快
–并发标记(和用户线程一块儿)
•主要标记过程,标记所有对象
–从新标记
•因为并发标记时,用户线程依然运行,所以在正式清理前,再作修正
–并发清除(和用户线程一块儿)
•基于标记结果,直接清理对象
- | - |
---|---|
线程数 | 并行多线程 |
工做模式 | 独占式 |
分代 | 老年代 |
碎片处理 | 标记压缩 |
GC 参数 | –-XX:+UseConcMarkSweepGC |
G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高几率知足GC停顿时间要求的同时,还具有高吞吐量性能特征. 在Oracle JDK 7 update 4 及以上版本中获得彻底支持, 专为如下应用程序设计:
G1 的长期目标是取代CMS(Concurrent Mark-Sweep Collector, 并发标记-清除). 由于特性的不一样使G1成为比CMS更好的解决方案. 一个区别是,G1是一款压缩型的收集器.G1经过有效的压缩彻底避免了对细微空闲内存空间的分配,不用依赖于regions,这不只大大简化了收集器,而 且还消除了潜在的内存碎片问题。除压缩之外,G1的垃圾收集停顿也比CMS容易估计,也容许用户自定义所但愿的停顿参数(pause targets)
上一代的垃圾收集器(串行serial, 并行parallel, 以及CMS)都把堆内存划分为固定大小的三个部分: 年轻代(young generation), 年老代(old generation), 以及持久代(permanent generation).
而 G1 收集器采用一种不一样的方式来管理堆内存.
堆内存被划分为多个大小相等的 heap 区,每一个heap区都是逻辑上连续的一段内存(virtual memory). 其中一部分区域被当成老一代收集器相同的角色(eden, survivor, old), 但每一个角色的区域个数都不是固定的。这在内存使用上提供了更多的灵活性
超连接: G1 收集器 详解
-XX:+UseSerialGC:在新生代和老年代使用串行收集器 -XX:SurvivorRatio:设置eden区大小和survivior区大小的比例 -XX: NewRatio:新生代和老年代的比 -XX:+UseParNewGC:在新生代使用并行收集器 -XX:+UseParallelGC :新生代使用并行回收收集器 -XX:+UseParallelOldGC:老年代使用并行回收收集器 -XX:ParallelGCThreads:设置用于垃圾回收的线程数 -XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器 -XX:ParallelCMSThreads:设定CMS的线程数量 -XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发 -XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理 -XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩 -XX:+CMSClassUnloadingEnabled:容许对类元数据进行回收 -XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收 -XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收