垃圾分代
Minor GC/scavengeGC次收集 Major GC/Full GC全收集
-
新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java 对象大多都具 备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。
-
老年代 GC(Major GC / Full GC):指发生在老年代的 GC,出现了 Major GC,经常会伴随至少一次的 Minor GC(但非绝对的,在 ParallelScavenge 收集器的收集策略里就有直接进行 Major GC 的策略选择过程) 。MajorGC 的速度一般会比 Minor GC 慢 10倍以上。
使用system.gc()方法 (建议性开启主GC模式,但不一定开启)
运行时间一般不会超过3-5秒的;
七个收集器:
上边是年轻代收集器 下边是老年代收集器,黑线G1是兼容性的收集器 可在年轻代与老年代同时使用它,他的蓝色连线表示年轻代与老年代可进行匹配的收集器;
新生代收集器:
串行收集器:Serial
他是在Hotspot在client模式下的默认银生代收集器,他的特点只用 一个cpu/一条收藏线程去完成GC工作,且在进行垃圾回收时必须暂停 所有的工作线程(stop The Word 简称stw)可以使用 -xx:+UseSerlalGC更换
简单高效,vm管理内存不大的情况向下收集几十到一两百兆的新生 代,停顿时间可以控制在几十毫秒-一百多毫秒内
并行收集器:ParNew
他是serial的多线程版本,除使用多条线程进行gc处理外,包括 serial可用的所有控制参数,收集算法,stw,对象分配规则,回收策 略等都与serial完全一样(他也是vm启用cms收集器的默认新生代 :- xx:+UseConcMarkSweepGC)
由于单线程切换的开销,parNew在但CPU的环境中比不上serial, 且在通过超线程技术实现的两个CPU的环境中也不能100%保证能超越 serial,但是可用的cpu数量的增加,收集效率也会大大增加(- xx:+parallelGCThreads=<N>)
parallel收集器:并行
Parallel Scavenge垃圾收集器因为与吞吐量关系密切,也称为吞吐 量收集器(Throughput Collector)。多线程 复制算法:
系统吞吐量=运行用户代码时间/(运行用户代码时间+垃圾回收时间)
停顿时间越短越有利于用户交互,而高吞吐量则适合后台运算不需 要太多交互的任务,可以尽快的完成运算任务。
老年代收集器:
serial old收集器:
采用"标记-整理"算法(还有压缩,Mark-Sweep-Compact) 单线程收集;
应用场景
主要用于Client模式;
而在Server模式有两大用途:
(A)、在JDK1.5及之前,与Parallel Scavenge收集器搭配使用(JDK1.6有Parallel Old收集器可搭配);
(B)、作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用
Parallel Old收集器
Parallel Old垃圾收集器是Parallel Scavenge收集器的老年代版本, JDK1.6中才开始提供; 采用"标记-整理"算法, 多线程收集;
应用场景
JDK1.6及之后用来代替老年代的Serial Old收集器;
特别是在Server模式,多CPU的情况下;
这样在注重吞吐量以及CPU资源敏感的场景,就有了Parallel Scavenge加 Parallel Old收集器的"给力"应用组合;
设置参数:
XX:+UseParallelOldGC:指定使用Parallel Old收集器;
CMS收集器 并发
并发标记清理(Concurrent Mark Sweep,CMS)收集器也称为并发低停顿收集器(Concurrent Low Pause Collector)或低延迟(low-latency)垃圾收集器;
基于"标记-清除"算法(不进行压缩操作,产生内存碎片);以获取最短回收停顿时间为目标;并发收集、低停顿; 需要更多的内存(看后面的缺点);
是HotSpot在JDK1.5推出的第一款真正意义上的并发(Concurrent)收集器;
第一次实现了让垃圾收集线程
应用场景
与用户交互较多的场景;
希望系统停顿时间最短,注重服务的响应速度;
以给用户带来较好的体验;
如常见WEB、B/S系统的服务器上的应用;
设置参数
*"-XX:+UseConcMarkSweepGC":*指定使用CMS收集器;
与用户线程(基本上)同时工作;
G1收集器:
包括年轻代与老年代的唯一的收集器;1.7才出来的商用的
A)、并行与并发
能充分利用多CPU、多核环境下的硬件优势;
可以并行来缩短"Stop The World"停顿时间;
也可以并发让垃圾收集与用户程序同时进行;
B)、分代收集,收集范围包括新生代和老年代
能独立管理整个GC堆(新生代和老年代),而不需要与其他收集器搭配;
能够采用不同方式处理不同时期的对象;
虽然保留分代概念,但Java堆的内存布局有很大差别;
将整个堆划分为多个大小相等的独立区域(Region);
新生代和老年代不再是物理隔离,它们都是一部分Region(不需要连续)的 集合;
C)结合多种垃圾收集算法,空间整合,不产生碎片
从整体看,是基于标记-整理算法;
从局部(两个Region间)看,是基于复制算法;
这是一种类似火车算法的实现;
都不会产生内存碎片,有利于长时间运行;
D)、可预测的停顿:*低停顿的同时实现高吞吐量*
G1除了追求低停顿处,还能建立可预测的停顿时间模型;
可以明确指定M毫秒时间片内,垃圾收集消耗的时间不超过N毫秒;
应用场景
面向服务端应用,针对具有大内存、多处理器的机器;
先到这里---- 后续慢慢给与细化,如有不足之处,欢迎大佬指点。。。