垃圾回收机制之复制算法

我再说一下什么是磁盘碎片化,磁盘碎片化表示删不干净,比如我格式化磁盘,肯定效率高一点,而且删的干净一点,

如果一个一个的删除的话,容易产生碎片,有一部分没有被删除掉,你们可以下去自己做一个例子,有的时候删不干净,就会产生

碎片化的问题,我们再讲一个算法,叫复制算法,复制算法是怎么来的呢,复制算法要讲到堆内存的划分,新生代和老年代,

左边叫新生代,右边可以理解为老年代,新生代里面存的是什么对象,刚出生不久的对象,老年代是被垃圾回收机制回收很多次

已经非常稳定的,经常使用的对象就会存在老年代里面,在新生代里面会分为这几个区域,第一个区域叫做EDEN区域,S0区和S1区,

或者from区和to区,S0区和S1区大小是相等的,为什么相等的,为什么S0区和S1区大小要相等呢,是因为这个原因,叫做复制算法,

首先我们来举一个例子,假如我们创建一个对象叫做user1,第一次要放到什么区里面去,我先做创建了一个user1对象,它是要放在

EDEN区,还是S0区还是S1区呢,是EDEN区是吧,user1对象会放在EDEN区里面,这个时候我们来了一个user2对象,user2对象是放在EDEN

对象还是S0区,还是S1区,一样的,他也会存在EDEN区里面,如果我们这个GC线程进行回收的时候,发现你们的user1和user2会被经常

使用到,你们觉得这个时候会进入到什么区里面去,就是GC线程发现user1和user2经常被使用的情况下,会存放到什么区里面去,

记住不是老年代,阀值必须要达到15次以上,比如这个时候我只是达到7,8次的时候,他一般会到from区或者to区,user1,user2

一般先到S0区的,这个时候我再来个对象叫做user3,我来了一个叫做user3对象,他是到哪个区里面去,EDEN区是吧,

这个时候user3对象到EDEN区里面去,同样的道理,如果发现EDEN区的user3经常被使用,那么他就会进入到哪个区里面去,

是不是S0区,同样是到S0区,那么这个时候垃圾回收机制,

发现你的user1和user2没有被经常使用,是一个不可达对象的情况下,这个时候怎么办,比如user1不可达了,垃圾回收机制

发现user1不可达了,就是没有被经常使用的情况下,但是user2和user3仍然被使用的情况下,怎么办呢,

这个时候就会把user2,user3 copy到S1里面去,copy到S1里面去的时候,然后直接把整个S0区给直接清除掉,记住是清除所有的,

然后把user2和user3 copy到S1里面去,清除S0的所有,清除的非常非常干净,这就叫复制算法,这个时候S0就没有任何数据的,

接着我再来一个对象,叫做user4对象,你们说看一下user4是存放在哪一个区域,EDEN区,这个时候user4对象会存放在eden区里面,

如果垃圾回收器发现eden区的user4对象经常被使用,这个时候user4对象会晋升到哪个区里面去,是进入到S0区还是S1区呢,

user4会晋升到S1区里面去,S0区是没有任何数据的,是S1区,有人说user4对象不会放到S0区,

偏偏要放到S1区呢,这个时候我就告诉你们,就是能够做复制,记住一点,S0区和S1区一定有一个为空的,他的目的是什么意思啊,

目的是为了存放下一个复制,比如这个时候我进行回收的时候,user2和user3没有继续使用的情况下,那这个时候怎么办,

user4对象还是会被继续使用的,user4对象会被放到S0区里面去,然后清除所有的S1区,目的是为了做下一次的切换,

这就叫做复制算法,这种算法有什么优点,优点是能够解决碎片化的问题,而且快速,清理干净,缺点是浪费空间,

比如我们建一个文件夹S0,然后建立一个文件夹S1,S0和S1的大小是相等的,我在S0区建一个对象,叫做user0,

然后这个时候再来一个对象叫做user1,当我进行回收的时候,S1区是空的,我发现user0没有被经常使用的情况下,

user1还是被继续使用,把它copy到S1区来,然后我直接把S0区的文件全部给删除掉,这就叫复制算法,这就相当于S0就是空的,

S1是不是有数据了他的目的是做删除的比较快一点,可以解决碎片化的问题,这个时候我再来一个对象叫做user2的话,

它是存放在S0区还是S1区呢,肯定是S1区,同样道理,你们现在去看,垃圾回收机制进行回收的时候,S1区的user1对象没有

被经常使用的情况下,我就把S1区的user2对象复制到S0区来,然后把整个的S1区给清掉,是不是可以解决碎片化的问题,

移动其实也相当于剪切一样的,你们说复制可能更好一点移动其实也算是复制,相当于copy一份,我先把存活对象放在

另一个区里面,GC回收将可达的对象复制到下一个区域,然后直接删除当前的区域,你们觉得复制算法一般用在哪个年代里面呢,

是用在新生代还是用在老年代里面呢,是新生代还是老年代,这肯定是新生代里面的,如果你在EDEN区直接不可达,那就直接删掉了,

不会进入到S0或者S1区的,如果在S0或者S1区经历了15次以上,肯定会到老年代里面去的,有的地方吧S0叫做from区,把S1叫做to区,

都是一个意思,to区就是S1区

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值