类别 | serialcollector(串行) | parallelcollector(并行) (throughputcollector)---(关注吞吐量) | concurrentcollector(并发) (concurrentlowpausecollector)----(关注响应时间) |
介绍 | 单线程收集器 使用单线程去完成所有的gc工作,没有线程间的通信,这种方式会相对高效 | 并行收集器 使用多线程的方式,利用多CUP来提高GC的效率 主要以到达一定的吞吐量为目标 | 并发收集器 使用多线程的方式,利用多CUP来提高GC的效率 并发完成大部分工作,使得gcpause短 |
试用场景 | 单处理器机器且没有pausetime的要求 | 适用于科学技术和后台处理 有中规模/大规模数据集大小的应用且运行在多处理器上,关注吞吐量(throughput) | 适合中规模/大规模数据集大小的应用,应用服务器,电信领域 关注responsetime,而不是throughput |
使用 | Client模式下默认 可使用 可用-XX:+UseSerialGC强制使用 优点:对server应用没什么优点 缺点:慢,不能充分发挥硬件资源 | Server模式下默认 --YGC:PSFGC:ParallelMSC 可用-XX:+UseParallelGC或-XX:+UseParallelOldGC强制指定 --ParallelGC代表FGC为ParallelMSC --ParallelOldGC代表FGC为ParallelCompacting 优点:高效 缺点:当heap变大后,造成的暂停时间会变得比较长 | 可用-XX:+UseConcMarkSweepGC强制指定 优点: 对old进行回收时,对应用造成的暂停时间非常短,适合对响应时间要求比较高的应用 缺点: 1.内存碎片和浮动垃圾 2.old去的内存分配效率低 3.回收的整个耗时比较长 4.和应用争抢CPU |
内存回收触发 | YGC eden空间不足 FGC old空间不足 perm空间不足 显示调用System.gc(),包括RMI等的定时触发 YGC时的悲观策略 dumplive的内存信息时(jmap–dump:live)
| YGC eden空间不足 FGC old空间不足 perm空间不足 显示调用System.gc(),包括RMI等的定时触发 YGC时的悲观策略--YGC前&YGC后 dumplive的内存信息时(jmap–dump:live)
| YGC eden空间不足 CMSGC 1.oldGen的使用率达到一定的比率默认为92% 2.配置了CMSClassUnloadingEnabled,且PermGen的使用达到一定的比率默认为92% 3.Hotspot自己根据估计决定是否要触法 4.在配置了ExplictGCInvokesConcurrent的情况下显示调用了System.gc. FullGC(SerialMSC) promotionfailed或concurrentModeFailure时; |
内存回收触发时发生了什么 | YGC 清空eden+from中所有noref的对象占用的内存 将eden+from中的所有存活的对象copy到to中 在这个过程中一些对象将晋升到old中: --to放不下的 --存活次数超过tenuringthreshold的 重新计算TenuringThreshold; 单线程做以上动作 全程暂停应用 FGC 如果配置了CollectGen0First,则先触发YGC 清空heap中noref的对象,permgen中已经被卸载的classloader中加载的class的信息 单线程做以上动作 全程暂停应用 | YGC 同serial动作基本相同,不同点: 1.多线程处理 2.YGC的最后不仅重新计算TenuringThreshold,还会重新调整Eden和From的大小 FGC 1.如配置了ScavengeBeforeFullGC(默认),则先触发YGC(??) 2.MSC:清空heap中的noref对象,permgen中已经被卸载的classloader中加载的class信息,并进行压缩 3.Compacting:清空heap中部分noref的对象,permgen中已经被卸载的classloader中加载的class信息,并进行部分压缩 多线程做以上动作.
| YGC 同serial动作基本相同,不同点: 1.多线程处理 CMSGC: 1.oldgen到达比率时只清除oldgen中noref的对象所占用的空间 2.permgen到达比率时只清除已被清除的classloader加载的class信息 FGC 同serial |
细节参数 | 可用-XX:+UseSerialGC强制使用 -XX:SurvivorRatio=x,控制eden/s0/s1的大小 -XX:MaxTenuringThreshold,用于控制对象在新生代存活的最大次数 -XX:PretenureSizeThreshold=x,控制超过多大的字节的对象就在old分配. | -XX:SurvivorRatio=x,控制eden/s0/s1的大小 -XX:MaxTenuringThreshold,用于控制对象在新生代存活的最大次数
-XX:UseAdaptiveSizePolicy去掉YGC后动态调整edenfrom已经tenuringthreshold的动作 -XX:ParallelGCThreads设置并行的线程数 | -XX:CMSInitiatingOccupancyFraction设置oldgen使用到达多少比率时触发 -XX:CMSInitiatingPermOccupancyFraction,设置PermGen使用到达多少比率时触发 -XX:+UseCMSInitiatingOccupancyOnly禁止hostspot自行触发CMSGC |