1.如何判定对象为垃圾对象
1.1引用计数法
1.2可达性分析
作为GCROOT的对象
- 虚拟机栈
- 本地方法区的类属性所引用的对象
- 方法区中常量所引用的对象
- 本地方法栈中引用的对象
2.如何回收
2.1回收策略
1.标记-清除算法
通过可达性分析法标记-->清除
缺点:效率较低、空间问题(出现很多不连续的内存空间)
2.复制算法
把使用中的内存复制一份重新按顺序排列
缺点:内存只能用一半,不适用于老年代
把Eden区保留的对象复制到Survivor区
3.标记-整理算法
让所有存活的对象都向一端移动,然后清理掉边界以外的内存
4.分代收集算法
标记整理算法和复制算法进行结合,针对新生代或者说是内存回收率较高的算法选择复制算法,对于老年代选择标记整理算法。
堆
- 新生代
- Eden 伊甸园
- Survivor 存活区
- Tenured Gen
- 老年代
2.2垃圾回收器
1.serial
- 历史最悠久
- 使用复制算法
- 单线程,垃圾收集时必须暂停其他所有的工作线程,直到收集结束
- 虚拟机运行在Client模式下的新生代收集器
- 用于桌面应用
2.parnew
- 多线程收集
- 虚拟机运行在Server模式下首选的新生代收集器
3.parallel Scavenge收集器
- 适用复制算法(针对新生代内存)
- 多线程收集器
- 达到可控制的吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
- -XX:MaxGCPauseMillis 垃圾收集器停顿时间
- -XX:GCTimeRatio 吞吐量大小 (0-100)
4.cms(Concurrent Mark Sweep)收集器
运作步骤:
标记清除--并发标记--重新标记--并发清除
优点
缺点
- 占用大量的CPU资源
- 无法处理浮动垃圾
- 出现Concurrent Mode Failure
- 基于标记清除算法,会产生大料的空间碎片
5.G1
面向服务端应用的垃圾收集器
优势:
- 并行与并发, 使用多个CPU来缩短Stop-The-Word停顿时间
- 分代收集
- 空间整合:整体上看基于标记-整理算法,局部上看基于复制算法
- 可预测停顿
运作步骤:
- 初始标记
- 并发标记
- 最终标记
- 筛选回收 Remembered Set
3.何时回收
java虚拟机——垃圾回收
原文:https://www.cnblogs.com/xinmomoyan/p/12309615.html