JVM在进行GC时:并不是对这三个区域(新生区,幸存区(from,to),老年区)统一回收,大部分时候,回收都是新生区
GC两种类:轻GC(普通的GC),重GC(全局的GC)
GC题目:
JVM的内存模型和分区,详细到每个区放什么
堆里面的分区有哪些?说说他们的特点
Eden,from,to,老年区,
标记清除、标记整理(压缩)、复制算法、引用计数
每一个对象都分配一个计数器(计数器也会占用内存空间),每当对象被调用一次,计数器便加1,当需要GC时,GC会查找被调用最少次的对象,将其淘汰。
该方法用的较少,因为一个大型项目或者循环创建对象时,计数器占用的空间将会变得非常大。
把对象之间的关系理解为一个树状结构,从某一起点出发,能够遍历到达的对象称之为“可达”,把无法到达的地方称之为“不可达”,将不可达的对象作为垃圾
可达性分析的关键要点为:进行上述遍历,需要有“起点”(GC Roots),起点可以是:
缺点:
好处:没有内存碎片
坏处:浪费了一个幸存区的空间(多了一半的空间一直是空的),在极端情况下,from区满了,需要全部复制到to区,十分浪费资源
复制算法最佳使用场景:地点:新生区,情况:在对象存活度较低 此时使用复制算法最佳
缺点:产生内存碎片;需要两次扫描,严重浪费时间
优点:不需要额外的空间
对标记清除算法的再次优化
缺点:又多了一个移动成本
优点:不会产生内存碎片
结合标记清除算法与标记压缩算法
先清理五次,再进行压缩
内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)
内存整齐度:复制算法=标记压缩算法>标记清除算法
内存利用率:标记压缩算法>标记清除算法>复制算法
GC:分代收集算法
年轻区:
老年区: