java虚拟机的认识(五)~垃圾回收机制策略

垃圾回收机制策略

标记清除算法:

 

该算法有两个阶段。

 

1. 标记阶段:找到所有可访问的对象,做个标记

 

2. 清除阶段:遍历堆,把未被标记的对象回收;

该算法一般应用于老年代,因为老年代的对象生命周期比较长。

优缺点
标记清除算法的优点和缺点 
1. 优点 
- 是可以解决循环引用的问题 
- 必要时才回收(内存不足时) 
2. 缺点: 
- 回收时,应用需要挂起,也就是stop the world。 
- 标记和清除的效率不高,尤其是要扫描的对象比较多的时候 
- 会造成内存碎片(会导致明明有内存空间,但是由于不连续,申请稍微大一些的对象无法做到),

复制算法:

 

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

  coping算法一般是使用在新生代中,因为新生代中的对象一般都是朝生夕死的,存活对象的数量并不多,这样使用coping算法进行拷贝时效率比较高。jvm将Heap 内存划分为新生代与老年代,又将新生代划分为Eden(伊甸园) 与2块Survivor Space(幸存者区) ,然后在Eden –>Survivor Space 以及From Survivor Space 与To Survivor Space 之间实行Copying 算法。 不过jvm在应用coping算法时,并不是把内存按照1:1来划分的,这样太浪费内存空间了。一般的jvm都是8:1。也即是说,Eden区:From区:To区域的比例是:8:1:1

  始终有90%的空间是可以用来创建对象的,而剩下的10%用来存放回收后存活的对象。

1、当Eden区满的时候,会触发第一次young gc,把还活着的对象拷贝到Survivor From区;当Eden区再次触发young gc的时候,会扫描Eden区和From区域,对两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To区域,并将Eden和From区域清空。

2、当后续Eden又发生young gc的时候,会对Eden和To区域进行垃圾回收,存活的对象复制到From区域,并将Eden和To区域清空。

3、可见部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认是15),最终如果还是存活,就存入到老年代

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

 

优缺点
优点:在存活对象不多的情况下,性能高,能解决内存碎片和java垃圾回收算法之-标记清除 中导致的引用更新问题。
缺点: 会造成一部分的内存浪费。不过可以根据实际情况,将内存块大小比例适当调整;如果存活对象的数量比较大,coping的性能会变得很差。

 

标记压缩算法:

 

任意顺序 : 即不考虑原先对象的排列顺序,也不考虑对象之间的引用关系,随意移动对象;

 

线性顺序 : 考虑对象的引用关系,例如a对象引用了b对象,则尽可能将a和b移动到一块;

 

滑动顺序 : 按照对象原来在堆中的顺序滑动到堆的一端。

优缺点
优点:解决内存碎片问题,
缺点:压缩阶段,由于移动了可用对象,需要去更新引用。

 

posted @ 2020-04-19 01:13  An-Optimistic-Person  阅读(108)  评论(0)    收藏  举报