目录
4. Parallel scavenge 收集器(吞吐量优先收集器)
常用版本默认垃圾回收器
- jdk1.7 默认垃圾收集器Parallel Scavenge+Parallel Old(吞吐量优先垃圾回收器)
- jdk1.8 默认垃圾收集器Parallel Scavenge+Parallel Old(吞吐量优先垃圾回收器)
- jdk1.9 默认垃圾收集器G1(进一步降低STW时间,同时兼顾良好的吞吐量)
在cmd中输入,查看当前jdk的垃圾回收器
java -XX:+PrintCommandLineFlags -version
1. Serial 收集器(串行收集器)
工作在新生代,采用单线程,进行回收垃圾时,必须暂停所有其它线程——stop the world,采用复制算法;能与CMS收集器配合工作,但效果不好
2. Serial Old 收集器
工作在老年代,与Serial 收集器相同工作方式,采用“标记—整理算法”
3. ParNew 收集器
工作在新生代,本质为Serial收集器的多线程版本,采用“复制算法”;只有它能与CMS收集器配合工作
4. Parallel scavenge 收集器(吞吐量优先收集器)
工作在新生代,JDK8默认新生代垃圾回收器,使用需求为高吞吐量时使用该收集器,采用“复制算法”;
5. Parallel old 收集器
工作在老年代,Parallel scavenge 收集器的老年代版本,采用的是“标记-整理”算法;
6. CMS 收集器(时间优先收集器)
工作在老年代,即Concurrent Mark Sweep收集器,追求最短停顿时间,采用“标记-清除”算法;
只有在初始标记和重新标记时,会STW,消耗时间很短,而并发标记和并发整理清除消耗时间最长
卡表:JVM 在进行垃圾收集的时候,有一项非常重要的工作就是确定这一次垃圾收集的对象到底有多少个,卡表设计目的尽量减少无用的垃圾扫描范围
卡表是 CMS 的解决方案
7. G1 收集器
全代回收器,可以设置STW的时间,将整个堆分为内存大小相等的区域(Region),每个区域有一个称为回收价值的属性,G1通过该属性判断是否进行垃圾回收,从而达到最高垃圾回收效率
标记清除算法
优点:速度快
缺点:内存不连续,会有内存碎片产生
标记整理算法
优点:没有内存碎片
缺点:需要移动对象,速度慢
复制算法
将内存空间二等分, 每次只使用其中一块,找出其中不是垃圾的对象
将不是垃圾的对象移动到另一半内存空间
整体删除之前内存的对象,然后两个内存地址互换
优点:内存不会发生碎片化
缺点:堆的使用效率低, 只有1/2