一、标记---清除算法(Mark and Sweep)
- 标记:从根集合进行扫描,对存活的对象进行标记。
- 清除:对堆内存从头到尾进行线性遍历,回收不可达对象内存。
二、复制算法(Copying)
- 分为对象面和空闲面。
- 对象在对象面上创建。
- 存活的对象被从对象面复制到空闲面。
- 将对象所有对象内存清除。
三、标记---整理算法(Compaction)
- 标记:从根集合进行扫描,对存活的对象进行标记。
- 清除:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。
四、分代收集算法(Generational Collector)
- 垃圾回收算法的组合拳。
- 按照对象生命周期的不同划分区域以采用不同的垃圾回收算法。
- 目的:提高JVM的回收效率
GC的分类:
- Minor GC
Minor GC 发生在新生代。
- Full GC
FullGC的触发条件:
(1)老年代空间不足。
(2) 永久代空间不足(主要针对jdk7以及之前的版本)。
(3) CMS GC时出现promotion failed,concurrent mode failure这两种状况发生时。
(4)Minor GC晋升到老年代的平均大小大于老年代的剩余空间。
(5) 调用System.gc()。
(6) 使用RMI来进行RPC或管理的JDK应用,每小时执行1次Full GC。
关于Full GC的 面试只要答三点以上就可以了。
-
年轻代:尽可能快速地收集掉那些生命周期段的对象
-
Eden区
-
两个Survivor区
-
老年代:存放生命周期较长的对象
-
使用标记-清理算法回收对象
-
使用标记-整理算法回收对象
对象如何晋升到老年代?
- 经历一定Minor次数依然存活的对象
- Survivor区中存放不下的对象
- 新生成的大对象(-XX: + PretenuerSizeThreshold)
常用的调优参数
- -XX:SurvivorRatio : Eden和Survivor的比值,默认 8 : 1。
- -XX:NewRatio : 老年代和年轻代内存大小的比例。
- -XX:MaxTenuringThreshold : 对象从年轻代晋升到老年代经过GC次数的最大阈值。
本文来自慕课网个人学习笔记。