java垃圾回收机制的三种回收算法图解

这块内容需要多画图理解

JVM内存中有五大模块:堆,方法区,栈,本地方法栈,程序计数器。而垃圾回收机制只存在于堆和方法区中,且绝大部分在堆中。
由于栈会弹栈,栈里面的数据会随着程序结束而出栈,故不存在垃圾。而程序计数器用于记录线程执行的行号,以确保线程切换后能记住当前线程执行的位置,因此也不存在垃圾。
在这里插入图片描述
所以我们探究的重点在于“堆”
下面来看看堆的内存结构
在这里插入图片描述
堆内存分为两个区——新生代区和老年代区。其中新生代区分为伊甸园区与幸存区。幸存区里是from和to区,两者是互相轮动变化的。
在幸存区没有放满对象时,垃圾回收属于轻GC,否则属于重GC。对于经历了15次(默认可调)GC的对象会进入老年代。如果老年代也满了,就会出现OOM错误(堆内存溢出)
在为堆的各内存区分配空间时,默认 (可调) 新生代:老年代=1:2;伊甸园:from:to=8:1:1

下面具体看三种回收算法
  1. 复制算法
    在这里插入图片描述
    from与to是轮动变化的,对伊甸园GC后。伊甸园的对象被清理了,而from的对象轮换到to里面,此时to变为from,原来的from变为to。以后每一次清理都会按照这个规律变化。清理后,伊甸园与to区都是空的。浪费了空间(内存利用率低),节省了时间。内存排列整齐。

  2. 标记清除算法
    在这里插入图片描述
    需要标记次数与扫描标记记录。浪费时间,增加内存消耗(内存利用率较高),且内存程碎片化排列,内存排列不整齐。

3.标记压缩算法

在这里插入图片描述
在标记清除算法的基础上在对不整齐的对象进行规整。浪费时间,增加内存消耗(内存利用率较高)。内存排列整齐

算法适用区域

新生代:存活率低——复制算法
老年代:存活率高——标记清除压缩混合实现(内存碎片少)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未来的千万富翁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值