JVM GC算法

一、 什么是GC?

GC,即Garbage Collection——垃圾收集。
在c/c++语言中,每个对象的创建都会对应一个销毁的过程,这个销毁完全由用户控制。
缺点: 用户需要控制每一个对象的生命周期,增大了编码的复杂度,降低了效率。稍有不慎,容易出现内存泄漏等问题。

而在jvm中,这项工作交给了jvm来管理。

二、GC的范围

jvm的内存划分
在JVM的五种内存模型中,有三个是不需要进行垃圾回收的:程序计数器、JVM栈、本地方法栈。因为它们的生命周期是和线程同步的,随着线程的销毁,它们占用的内存会自动释放,所以只有方法区和堆需要进行GC。

三、 GC算法

GC是一个自动清除无用对象的事情,所以GC是有两阶段的,先要判断对象是否可以回收,然后才开始清理。

判断对象是否可以回收,业界主要有两种算法:
1. 引用计数法

·老牌垃圾回收算法
·通过引用计算来回收垃圾
·使用者:
COM
ActionScript3
Python

2.可达性分析算法

从GC Root对象向下搜索其所走过的路径称为引用链,当一个对象不再被任何的GC root对象引用链相连时说明该对象不再可用,GC root对象包括四种:方法区中常量和静态变量引用的对象,虚拟机栈中变量引用的对象,本地方法栈中引用的对象; 解决循环引用是因为GC Root通常是一组特别管理的指针,这些指针是tracing GC的trace的起点。它们不是对象图里的对象,对象也不可能引用到这些“外部”的指针。

Java GC采用的是第二种方法,可达性分析算法。

垃圾回收算法:
1.标记-清除算法

先标记所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
缺点:效率不高;易产生不连续的内存碎片。
标记-清除算法

2.复制算法

将内存空间分为大小相等的两块。只使用其中的一块。
每次清理时,将正在使用的空间中存活的对象复制到另一块空间内。
优点:实现简单、运行高效、不会产生内存碎片。
缺点:内存会缩小一半。
复制算法
现在的商业虚拟机都采用这种算法来回收新生代。
IBM的研究表明,新生代中98%的对象都是“朝生夕死”的,因此不需要按照1:1的比例来划分内存空间。而是将内存分为一块较大的Eden空间和两块较小的Survivor空间。每次使用Eden和其中的一块Survivor。(HotSpot默认Eden和Survivor的比例为8:1)
回收时,将Eden空间和使用的Survivor一起复制到另一块Survivor中。
这时候可能会存在问题:如果Survivor空间不够用。 此时就需要老年代的内存来进行分配担保,也就是说剩余的对象会直接进入老年代。

3.标记-整理算法

分为标记、整理两个阶段。标记阶段和标记-清除算法里面的标记阶段一样; 整理阶段则会让所有的存活的对象都向一端移动,然后直接清理掉边界以外的内存。
标记-整理算法
特点:不易产生内存碎片、不占用额外内存空间。适用于对象存活率较高的场景(老年代)。

4.分代收集算法

当前商用虚拟机的垃圾回收器都采用分代收集,分代收集严格上说不算一种新的算法。 只是根据对象存活周期的不同将内存再划分为几块(一般是新生代和老年代)。
根据不同年代对象的特点,来选取不同的回收策略。
比如新生代存活率很低,适用于复制算法;老年代存活率很高,就适用于标记-清除、标记整理算法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值