回收算法--标记清除:

把对象占用的起始结束地址记录下来,放在一个空闲的地址列表中,下次分配新对象时,将会到这个空闲地址列表中查找有没有足够的空间可以容纳新对象,如果有就进行内存分配,并不会对所占用的地址空间进行清除操作;

回收算法+分代回收+垃圾回收器

优点:速度很快,因为只需要对起始结束地址进行记录即可,不需要进行清除操作;

缺点:容易产生内存碎片;如果需要创建的是一个连续的数组空间,它会在空闲地址表中查找可以存放的地址空间,但是每一个地址空间都无法进行容纳,不过总的空闲空间很明显可以容纳该新对象,此时就是内存碎片;

回收算法--标记整理:

回收算法+分代回收+垃圾回收器

标记整理将无用的内存空间标记之后,将占用的地址空间按序放到一起,使未使用的空间变成一整块大的空间,此时避免了内存碎片的出现;

优点:减少了内存碎片

缺点:整理过程中涉及到移动,移动的话效率就会很低,因为会涉及对象引用地址的改变;

回收算法--复制:

复制算法是产生两块大小一致的空间,在from中,首先对没有引用的空间进行清楚工作,然后将使用的空间移动到to中,再将from进行清楚变成一整块未使用的空间,之后将from和to空间进行交换,此时不会产生碎片空间;

回收算法+分代回收+垃圾回收器

优点:不会产生内存碎片

缺点:会占用双倍的内存空间

分代回收

新生代存放的是朝存夕死的对象,而老年代存放的是需要存活很久的对象;

回收算法+分代回收+垃圾回收器

原理:当有一些对象被创建之后,要存放到伊甸园中,如果下一个要存放的对象比伊甸园剩余空闲的位置要大的话会触发Minor GC机制,进行垃圾回收,此时会扫描伊甸园中的对象,如果该对象还可以继续幸存,那么将会将该对象放到幸存区To中,并将寿命加1;然后将伊甸园中不再需要的对象进行回收,然后交换幸存区From和幸存区To的位置,这样下一个要存放的对象就可以放入伊甸园中;

如果伊甸园再次满了,即将要存放的对象A无法放入伊甸园中,那么就会再次触发Minor GC机制进行垃圾回收,此时会扫描伊甸园中的信息以及幸存区To中的信息,如果存在不再使用的对象将会被回收,继续可以存活的对象将会放到幸存区To中,并将寿命加1,交换幸存区From和幸存区To的位置;

但是当对象的寿命超过15时,说明他不应该频繁的被垃圾回收,应该将他放在老年代中,老年代中垃圾回收的频率较低,不会轻易回收;

回收算法+分代回收+垃圾回收器

当出现上图情况时,即新创建的对象在新生代和老年代中都没有可以放下的位置,那么会触发Full GC机制,此时将会扫描新生代和老年代,找到可以垃圾回收的位置进行回收,然后将其放入;

分代回收--总结:

  • 对象首先分配在伊甸园区域
  • 新生代空间不足时,触发minor gc,伊甸园和from存活的对象使用copy复制到to中,存活的对象年龄加1并且交换from to
  • minor gc会引发stop the world,暂停其它用户的线程,等垃圾回收结束,用户线程才恢复运行
  • 当对象寿命超过阈值时,会晋升至老年代,最大寿命是15(4bit)
  • 当老年代空间不足,会先尝试触发minor gc,如果之后空间仍不足,那么触发full gc,STW的时间更长

垃圾回收器

  • 串行:

     定义:底层是一个单线程的垃圾回收器,运行时会把其他线程都暂停;

     适用场景:堆内存较小,适合个人电脑;

  • 吞吐量优先:

     定义:多线程

     适用场景:堆内存较大,适合多核CPU进行支持

     目标: 单位时间内,尽可能让STW时间最短;    0.2+0.2=0.4

  • 响应时间优先:

     定义:多线程

     适用场景:堆内存较大,适合多核CPU进行支持

     目标: 尽可能让单次STW时间最短;     0.1+0.1+0.1+0.1+0.1=0.5

垃圾回收器--串行:

回收算法+分代回收+垃圾回收器

当有多个CPU线程正在运行时,此时内存不足将会到达一个安全点;

因为是单线程的,所以只有一个垃圾回收线程,当进行垃圾回收时,其他的将会阻塞,垃圾回收结束之才会继续运行;

垃圾回收器--串行:

回收算法+分代回收+垃圾回收器

此时是多线程的,因为是多线程的,四核CPU都去进行垃圾回收,所以当进行垃圾回收时,CPU占用率会变成100%;

垃圾回收器--响应时间优先:

回收算法+分代回收+垃圾回收器

相关文章: