对象是否存活
- 引用计数法:
当一个对象增加一个引用时,加1,否则减1,为0的时候删除,当然,相互依赖的问题无法解决 - 可达性分析:
从GC Roots开始搜索,如果一个对象与GC Root之间没有怎么路径,则称该对象是不可达的。(锁持有的对象、静态变量,栈中引用的对象等可以作为gc root)
回收算法的优缺点
复制算法(新生代)
相关 | 将内存分为两部分,每一次将存活的移动到另一份内存,然后进行清除 |
---|
优点 | 不会产生碎片化 | 缺点 | 浪费内存资源 |
标记清除(老年代)
相关 | 标记所有引用的对象,将未被引用的进行清除 |
---|
优点 | 实现较为简单 | 缺点 | 回收的空间是不连续,产生内存碎片 |
标记整理(老年代)
相关 | 结合整理清除和复制算法,将标记的引用的对象移动到一起,进行清除 |
---|
优点 | 解决了内存碎片的问题,解决了复制算法所需内存空间过大的问题 | 缺点 | 需要移动,成本更高 |
垃圾回收器
serial收集器 | Serial收集器是最基本的收集器 |
---|
特点 | 新生代,单线程、简单高效,存在STW问题,复制算法 ,暂停所有用户线程 |
parnew收集器 | 是Serial收集器的多线程版本 |
---|
特点 | 新生代,多线程,复制算法,暂停所有用户线程 |
parallel scavenge收集器 | 与吞吐量关系密切,故也称为吞吐量优先收集器 |
---|
特点 | 新生代,复制算法,多线程,GC自适应调节策略 ,暂停所有用户线程 |
serial old 收集器 | Serial收集器的老年代版本 |
---|
特点 | 老年代,单线程,标记-整理算法,暂停所有用户线程 |
parallel old收集器 | Parallel Scavenge收集器的老年代版本 |
---|
特点 | 老年代,多线程,标记-整理算法 ,暂停所有用户线程 |
cms收集器 | 获取最短回收停顿时间为目标 |
---|
特点 | 老年代,标记-清除算法,并发收集、低停顿。 |
垃圾回收器搭配
新生代 | 老年代 | java8 |
---|
Serial收集器 | CMS收集器 | 不推荐 | Serial收集器 | SerialOld收集器 | | ParNew收集器 | CMS收集器 | | ParNew收集器 | SerialOld收集器 | 不推荐 | Parallel Scavenge收集器 | SerialOld收集器 | | Parallel Scavenge收集器 | Paraller old收集器 | |
|