JVM 虚拟机 GC
GC
JVM 在进行GC时,并不是对这三个区域统一回收,大部分回收都是在新生代
- 新生代
- 幸存区(from,to)
- 老年代
GC两种类型:轻GC(普通GC),重GC(全局GC)
当一个对象经历了15次GC,都没有死就会进入养老区域
JVM设定GC老年代次数:-XX:MaxTenuringThreahold=5
通过这个参数,可以设定进入老年代的时间
Eden:from:to = 8:1:1
- JVM的内存模型~详细到每个区放什么?
- 堆里面的分区有哪些?Eden,from,to,老年区,说说特点
- GC算法?标记清除法,标记压缩,复制算法,引用计数,怎么用
- 轻GC和重GC分别在什么时候发生
引用计数法:
复制算法:
是针对Eden,from和to区域及年轻代
对于from和to如何区别?
谁空谁是to
- 每次GC都会将Eden活着的对象移到幸存区中:一旦Eden区被GC后,就会是空的!
- from和to区域是互相交替的,会将from区的对象,复制到to中,然后from中就会空的。此时from就会变为to,to变为from
- 好处:没有内存的碎片
- 坏处:浪费了内存空间:多了一半空间永远是空to,假设对象100%存活(极端情况)OOM
复制算法最佳使用场景:对象存活度较低;新生区使用
标记清除法
- 缺点:两次扫描严重浪费时间,或产生碎片。
- 优点:不需要额外的空间
标记压缩
再优化:
多了移动成本
##总结
内存效率:复制算法>标记清除法>标记压缩算法(时间复杂度)
内存整齐度:复制算法=标记压缩>标记清除法
内存利用率:标记压缩=标记清除>复制算法
没有最好的算法,只有最合适的算法—->GC:分代收集算法
年轻代:
- 存活率低:复制算法
老年代: - 区域大:存活率高
- 标记清除+标记压缩混合实现
本作品采用《CC 协议》,转载必须注明作者和本文链接