初入JVM学习(GC垃圾回收)

本文详细解析了Java中垃圾回收的基本概念,包括轻GC和重GC的工作原理,以及复制算法、标记清除算法和标记压缩算法的特点。通过对比不同算法的优缺点,帮助读者理解年轻代和老年代分别适用的垃圾回收策略。

GC:垃圾回收

回收地方:堆和方法区

JVM在进行GC时,并不是对这三个区域(新生代,幸存区,老年代)统一回收,大部分回收在新生代。
GC两种类:轻GC,重GC

轻GC主要是新生代,偶尔在幸存区。重GC全部清理(释放内存)

引用计数法

在这里插入图片描述
引用计数法,会给每一个对象都分配一个计数器,对象被使用过1次则为1,对象如果没有被使用过为0,为0的对象最后会被GC垃圾回收

缺点:对象间的循环引用无法解决,且计数器的分配和计算消耗。

class Person{
    public Person lover = null;//定义一个爱人

    private String name = "";//姓名
    Person(String name){
        this.name = name;
    }
}
public class Demo {
    public static void main(String[] args) {
        Person liangshanbo = new Person("梁山伯");//创建一个人物:梁山伯
        Person zhuyingtai = new Person("祝英台");//创建一个人物:祝英台
        liangshanbo.lover = zhuyingtai;//设置梁山伯的爱人是祝英台
        zhuyingtai.lover = liangshanbo;//设置祝英台的爱人是梁山伯
    }
}

两个对象是互相引用的,Java无法根据计数器为0来判断哪个对象引用为0,所以两个对象都没有去回收。

复制算法

在这里插入图片描述
幸存0区和幸存1区,不断交换,谁空谁是to。
to区永远都是干净的。

当一个对象经历了默认GC垃圾回收15次还没有死,就会进入养老区。

由于两个幸存区不断复制,所以新生区使用的是复制算法

好处:没有内存碎片
坏处:to区总是空的浪费了内存空间
假设对象存活率过高,复制算法效率就会降低

标记清除算法

在这里插入图片描述
优点:不需要额外空闲的内存空间
缺点:两次扫描浪费时间,并且产生内存碎片

标记压缩算法:先标记清除几次,在进行压缩
  1. 在标记清除算法之上,在进行扫描一次
  2. 被标记使用过的对象,往前移动,内存碎片往后移动
  3. 连续的内存碎片不是内存碎片

缺点:再次扫描一次,并且多了移动成本
优点:没有内存碎片了

总结

  • 内存效率: 复制算法 > 标记清除算法 > 标记压缩算法(时间复杂度)
  • 内存整齐度: 复制算法 = 标记压缩算法 > 标记清除算法
  • 内存利用率: 标记压缩算法 = 标记清除算法 > 复制算法

没有最好的算法,只有最合适的算法

年轻代:
存活率低
复制算法
老年代:
存活率高
标记清除+标记压缩算法(内存碎片达到一定的值,进行压缩,jvm调优)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值