JVM在进行GC(垃圾回收机制)时,并不是对这三个区域统一回收。大部分时候,回收都是新生代~
①: 新生代()
②: 幸存区(from 来, to 去)
③: 老年区
GC两种类: 轻GC(普通的GC), 重GC(全局GC)
GC题目:
1、JVM的内存模型和区分~ 详细到每个区放什么?
2、堆里面的分区有哪些? Eden, form ,to 老年区, 说说他们的特点!
3、GC的算法有哪些? 标记清除法,标记压缩,复制算法,引用计数法,怎么用的?
4、轻GC 和 重 GC 分别在什么时候发生?
引用计数法:
复制算法:(谁空谁是to,当一个对象经历了15次GC,都还没有死,就会进入养老区
-XX: -XX:MaxTenuringThreshold=5
通过这个参数可以设定进入老年代的时间,默认是15)
1、每次GC 都会将伊甸园区活的对象移到幸存区中:一旦Eden区被GC后,就会是空的
好处: 没有内存的碎片~!!
坏处: 浪费了内存空间~~: 多了一半空间永远是空to。假设对象100%存活(极端情况)
复制算法最佳使用场景:对象存活度 较低的时候;新生区!
标记清除算法:
优点:不需要额外的空间
缺点:两次扫描,严重浪费时间,会产生内存碎片
标记压缩算法:
标记清除压缩算法:
先标记在清除几次,最后压缩
总结:
1、内存效率: 压缩算法>标记清除算法>标记压缩算法(时间复杂度)
2、内存整齐度:复制算法>标记压缩算法>标记清除算法
3、内存利用率:标记压缩算法 = 标记清除算法 > 复制算法
难道没有最优的算法嘛?
没有最好的算法,只有最合适的算法——————>GC:分代收集算法
年轻代(伊甸园区+ 幸存区):
1、存活率低
2、复制算法
老年代:
1、区域大:存活率高
2、利用标记清除(内存碎片不是太多)+标记压缩混合 实现