欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java虚拟机-垃圾回收算法

程序员文章站 2023-11-16 10:42:46
标记清除算法 标记出所有存活的对象,然后统一回收没有被标记的对象 缺点:1.效率方面,标记清除效率低 2.空间方面,会产生大量不连续的内存空间,大量的内存碎片在程序运行过程中存放大的对象时,因没有足够连续内存而出发下一次GC 复制清除算法 把内存按可用容量平均分为两份,一次只使用一块,当一块内存用完 ......

标记清除算法

标记出所有存活的对象,然后统一回收没有被标记的对象

缺点:1.效率方面,标记清除效率低

  2.空间方面,会产生大量不连续的内存空间,大量的内存碎片在程序运行过程中存放大的对象时,因没有足够连续内存而出发下一次GC

 

复制清除算法

把内存按可用容量平均分为两份,一次只使用一块,当一块内存用完了,为把所有存活的对象复制到一块另一块上,然后把使用过的内存一次清理掉

每次都是对整个半区清理,内存分配不用考虑碎片化等问题,只要移动堆顶指针,顺序分配内存就可以了,实现简单,运行高效

缺点:整个内存只有一半可用

改进:大部分对象都是朝生夕死,所以不用1:1划分,将内存分为一块较大Eden,两块较小的Survivor,每次使用Eden和一块Survivor,当回收时,

把Eden和Survivor中存活的对象复制到另一块Survivor中,然后统一清理掉Eden和使用过的Survivor,hotspot虚拟机默认Eden和Survivor的比例

为8:1,没法保证每次回收都只有小于10%的对象存活,所以当Survivor空间不足时,需要依赖其他内存(老年代)分配担保(当另一块Survivor每次足够

空间存放上次新生代存活下来的对象,这些对象根据分配担保直接进入老年代,每次回收后,存活的对象年龄+1,当年龄到达老年代闸值,进入老年代)

java虚拟机-垃圾回收算法

 

Eden Survivor复制过程

Eden:对象创建首先会放入此区域,进行垃圾回收时,存活的对象存放到Survivor中

Survivor:分为To Survivor和From Survivor两块大小一致的空间,当垃圾回收时,Eden不能被回收的对象放入Survivor(即To Survivor,同时Eden的区域会在垃圾回收时全部释放),

另一个Survivor(Form Survivor)中的存活的对象也放入这个Survivor(To survivor),然后To Survivor 和 From Survivor的标记互换,始终保证一个Survivor为空

 

标记整理算法

复制收集算法在对象存活率高的情况下要进行较多的复制,效率将会变低.如果不想浪费50%的内存空间,就需要额外的空间进行分配担保,以应对使用内存中对象100%存活的极端

情况.所以老年代一般不采用这种方法

标记过程和标记清除算法一致,但是后续不是直接对可回收对象清理,而是使存活对象往一端移动,直接清理掉端边界以外的内存

 

分代收集算法

根据对象的存活周期把内存划分为几块.一般java把内存分为新生代和老年代,根据各个年代特点采用最适当的收集算法

新生代:对象朝生夕死,每次收集都有大量对象死去,之后少量存活,可采用复制清除算法,只需要付出少量复制成本就可以完成清除

老年代:老年代因为对象存活率高,没有额外的空间进行分配担保,只有采用标记-清理或标记-整理算法来清除