java垃圾回收算法之-coping复制

来源:互联网 发布:淘宝咖啡店 编辑:程序博客网 时间:2024/06/16 03:39

之前的java垃圾回收算法之-标记清除 会导致内存碎片。下文的介绍的coping算法可以解决内存碎片问题。

概述


如果jvm使用了coping算法,一开始就会将可用内存分为两块,from域to域, 每次只是使用from域,to域则空闲着。当from域内存不够了,开始执行GC操作,这个时候,会把from域存活的对象拷贝到to域,然后直接把from域进行内存清理。

应用场景


coping算法一般是使用在新生代中,因为新生代中的对象一般都是朝生夕死的,存活对象的数量并不多,这样使用coping算法进行拷贝时效率比较高。不过jvm并不会根据新生代的特点,在应用coping算法时,并不是把内存按照1:1来划分的,这样太浪费内存空间了。一般的jvm都是8:1。

jvm将Heap 内存划分为新生代与老年代,又将新生代划分为Eden(伊甸园) 与2块Survivor Space(幸存者区) ,然后在Eden –>Survivor Space 以及From Survivor Space 与To Survivor Space 之间实行Copying 算法。

这里写图片描述

1、当Eden去满的时候,会进行young gc,把还活着的对象拷贝到Survivor From区;、
2、当Survivor 0区也慢了,则把活着的对象移到Survivor To区,Survivor From被清空
3、当Eden区再次发生young gc的时候,直接把存活的对象复制到Survivor To区
4、当Survivor To区也满的时候,又会再次把存活的对象复制到Survivor From区,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认是15)

注意:

万一存活对象数量比较多,那么To域的内存可能不够存放,这个时候会借助老年代的空间。

优点


在存活对象不多的情况下,性能高,能解决内存碎片和java垃圾回收算法之-标记清除 中导致的引用更新问题。

缺点


  • 会造成一部分的内存浪费。不过可以根据实际情况,将内存块大小比例适当调整;
  • 如果存活对象的数量比较大,coping的性能会变得很差
0 0
原创粉丝点击