易懂解析垃圾回收器

  从事java行业开始,对垃圾回收器是又熟悉又陌生,当面试的时候或者工作的时候,对垃圾回收期又非常的敬畏,如今,终于对这玩意有点了解了。

    一、垃圾回收器分为新生代,老生代,持久代。

      新生代有eden区,二个 survivor区。new一个对象,则在堆内存存放了一个对象,也就是存放在新生代(eden),当对象通过根搜索算法判定为不可达,再通过二次标记为待回收时,则等待下次gc回收了,当eden内存满了,会进行GC,通过标记复制算法,把仍存活的对象复制到suvor区的其中一个区(from survivor),同时eden清除清空,当from survevor满了,同样的回收算法,就会把eden,from survivor区仍存活的对象复制到另一个survivor(to survivor),同时eden,from survivor清空,如果大对象在to survivor存放不了,则会还复制进老生区。老生区满的时候,则通过标记整理或者分代收集算法(!)进行回收,进行full gc。当jvm进行full gc的时候,会造成线程堵塞,cpu暴涨,所以减少full gc。另外特别注意,大对象会直接进去老生区,存活年龄大的对象也会直接进去老生区。

二、垃圾回收算法

在上面提过,各个分区在垃圾回收时候,执行的算法。可以归结为,在eden,新生对象比较频繁,所以采用标记清除算法,在survivor区则采用的是复制算法,在老生区用的是标记整理算法,现在生产环境的算法用的都是分代收集算法。简单说一下分代收集算法,是区分新生代和老生代执行不行的算法,比如新生代eden则执行标记清除,survivor则执行复制算法,老生区则执行标记整理算法。下面来说一下各算法的区别,标记清除算法,比较耗内存效率低,复制算法则避免了。老生区为了更快的效率不用来回复制,直接将待回收的放到一个边缘,超过的被执行回收。

你可能感兴趣的:(易懂解析垃圾回收器)