GC垃圾回收机制
GC两种类:
轻GC、重GC(全局GC)
GC的算法:
-
标记清除法
益:不需要额外的空间。
弊:两次扫描,严重浪费时间(时间成本),产生内存碎片。
-
标记压缩
是对标记清楚的再次优化。
益:防止内存碎片产生。
弊:在标记清楚的基础上再次扫描,移动存活的对象,多了一个移动成本。
-
复制算法
在GC过程中,幸存区0和幸存区1谁空谁就是to,另外一个是from。两者都不空通过复制算法,将一个幸存区置空,复制到from区,则该幸存区为to。目的是为了让幸存区from、to分明,并且是动态的。可以用过-XX: MaxTenuringThreshold=?来设置进入养老区的时间。默认情况下,一个对象经过15次GC没有被回收,就进入老年区。
益:没有内存碎片。
弊:浪费内存空间,多了一半空的内存(to)。假设对象100%存活(极端情况),全部从from复制到to,成本太高(内存成本)。
最佳使用场景:对象存活度较低的时候,新生区
-
引用计数法
·
总结:
-
内存效率(时间复杂度):复制算法>标志清除算法>标记压缩算法(时间复杂度)
-
内存整齐度:复制算法=标记压缩算法>标记清除算法
-
内存利用率:标记压缩算法=标记清除算法>复杂算法
没有最优算法,只有最合适的算法。
GC:分代收集算法
新生代:
- 存活率低
- 复制算法
老年代:
- 区域大,存活率高
- 标记清除+标记压缩混合