概述
JVM 垃圾回收器
根据内存区域划分,垃圾回收器可分为三种类型
- 年轻代回收器
- 老年代回收器
- G1回收器(特殊不分区)
根据工作方式划分,垃圾回收器又可分为两种类型 - 单线程
- 多线程
年轻代
Serial收集器
client模式下默认的收集器,它是单线程串行工作的,在工作的时候需要停止所有线程
优点
简单高效
缺点
需要停止所有线程
Parallel Scavenge
并行多线程收集器,与之相对应的是老年代的Parallel Old收集器,无法与老年代的CMS配合使用。
它更关注吞吐量,其他的收集器更关注停顿时间
ParNew
它是Serial收集器的多线程版本,server模式下默认的收集器,它可以与CMS配合使用
老年代
Serial Old
它是单线程收集器,采用标记-整理算法实现
主要用途
- 在Parallel old收集器推出之前(jdk1.5),配合Parallel Scavenge收集器使用
- 作为CMS的后备方案
Parallel Old
并行多线程收集器,更关注吞吐量,可以与Parallel Scavenge搭配使用
CMS
获取最短停顿时间为目标的收集器
工作流程
- 初始标记
暂停所有线程,根据GC ROOTS进行搜索,记录存活对象 - 并发标记
开启GC线程和用户线程,记录可存活的对象,并跟踪记录此时用户线程发生引用更新的地方 - 重新标记
暂停线程,修正并发标记期间,发生修改的对象 - 并发清除
开启所有线程,由GC线程对未标记的对象进行清理
优点
- 并发收集
- 低停顿延时
缺点
- 对CPU资源敏感,可能占用大量的CPU
- 无法处理浮动垃圾
- 使用标记-清除算法,会产生内存碎片
什么是浮动垃圾?
在并发清除阶段,用户线程还会同时产生新的垃圾,这部分垃圾需要等到下一次gc才会进行回收
G1
G1(Garbage-First),它是一款面向服务端应用的垃圾收集器,即满足低GC时间要求,还具备高吞吐量的特点。它的使命是未来可以替换掉 CMS 收集器。
G1将内存区域划分为多个独立区域(Region),使年轻代、老年代不再物理隔离。
使用场景
主要针对多核CPU和大内存的机器
参数设置
使用【-XX:NewRatio=n】来配置新生代与老年代的比例,默认为2
特点
- 横跨整个堆内存
- 支持设置停顿时间
- 避免全堆扫描
为什么G1可以设置停顿时间?
G1会跟踪每个Region里的垃圾堆积的价值,并维护一个回收优先级的列表,根据时间允许程度,优先回收最大价值的区域
工作流程
- 初始标记
标记GC ROOTS可直接关联的对象 - 并发标记
从GC ROOTS开始进行可达性分析,标记存活对象 - 最终标记
停止所有线程,给对象进行最后的标记与分类,决定哪些对象可以回收 - 筛选回收
- 会计算存活对象的占比及回收效率
- 会回收年轻代、老年代
- 停止所有线程,按照优先级在规定的时间内进行回收
优点
- 并发与并行
可以让GC线程和用户线程同时执行 - 分代回收
G1是直接管理整个堆内存,不区分年轻代和老年代,但还是保留了分代回收的思想 - 空间整理
采用标记-整理 + 复制算法实现,不会有内存碎片的问题出现 - 可预测的停顿
除了低延时外,还可以手动指定停顿时间
缺点
- 需要占用大量的内存空间,在堆内存的20%左右
- 最终标记阶段时间开销较大
GC
- 年轻代内存比例超过60%的时候,会触发Minor gc
- 老年代内存比例超过45%的时候,会触发Mixed GC
G1中有多少个Region?
计算方式:堆内存/2048
最多可以有2048个Region
每个区域大小必须为2的倍数
G1对比PerNew+CMS的进步是什么?
- G1可以设置时间停顿模型,可以控制每次回收停顿的时间
- G1的算法为标记-整理算法,CMS为标记-清理算法
什么情况下使用G1
在大内存的情况下使用G1,在小内存的情况下使用CMS
如何判断内存大小
大小内存的界限为6GB-8GB
最后
以上就是重要花生为你收集整理的【JVM】JVM 垃圾回收器JVM 垃圾回收器的全部内容,希望文章能够帮你解决【JVM】JVM 垃圾回收器JVM 垃圾回收器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复