Serial收集器:最基础,历史最悠久的收集器,单线程(serialization)。采用标记复制算法+stop the world。客户端模式下默认收集器
ParNew收集器:是Serial收集器的多线程版本。除了Serial收集器外,只有ParNew能与CMS配合工作
Parallel Scavenge收集器:同样也是标记复制算法,但其关注点是吞吐量(运行用户代码的时间与处理器总耗时)
Serial Old收集器:Serial收集器的老年代版本,单线程的,使用标记整理算法。现在主要作为CMS的后备预案使用
Parallel Old收集器:Parallel Scavenge的老年代版本,多线程,使用标记整理算法。这两者配合吞吐量优先才名副其实
CMS(Concurrent Mark Sweep)收集器:目标是最短回收停顿时间。使用标记清除算法,空间碎片严重时(Concurrrent Mode Failure)采用标记整理(Serial Old收集器预案)
Garbage First(G1)收集器:基于Region内存布局,收集的范围不再是新生代老年代,而是CSet(Collection Set)。也是JDK9默认收集器。
内存分配:前面说了很多内存回收,再说一说内存分配
对象优先在Eden区分配,如果Eden区没有足够的空间进行分配,虚拟机将发起一次MinorGC
大对象直接进入老年代。长期存活的对象也进入老年代
动态对象年龄判定,默认大于等于15岁就进入老年代,但如果某一年龄对象加起来已经超过一半内存了,那就用这个年龄值作为标准
空间分配担保,在MinorGC之前,检查老年代是否有足够连续空间存放新生代对象。如果有可以安全执行。如果没有,检查均值,合适就进行一次冒险,不合适就进行Full GC