JVM系列七:(GC)

236 阅读3分钟

1.常见的垃圾收集器

部分垃圾收集器使用的模型: 除了Epsilon ZGC shanandoah ,其他都使用逻辑分代 G1逻辑分代,物理不分代 其他都是逻辑分代,物理分代 (分代指JVM内存分代模型多对应的分代垃圾回收)

垃圾收集器也是一步一步演变过来,初始,内存比较小,几十几百M,单一的serial即可实现回收,后来计算机内存慢慢变大,强化serial出现PS,即parallel sweep (并行清理)。清理时,又分为新生代(young区的垃圾收集器清理),和老年代垃圾收集器清理,有parallel old,YGC等还好,但是FullGC可能会产生严重的SWT,即停止其他线程运转,GC线程去进行FullGC。为解决这个问题1.4出现了CMS,使用三色标记算法回收,在不停止正常工作的情况下,进行并发式的标记回收,最后产生的浮动垃圾,由下次GC过程回收,中途没有收集到的,短暂停止,标记。

2.垃圾回收算法: 标记清除(会产生内存碎片,两遍扫描) 标记整理 (两遍扫描,需要调整指针) 标记复制 (没有碎片,浪费空间)

3.垃圾判断: 引用计数 根引用可达

4.对象的分配:

对象在new出来时,有逃逸检测等,对象是否大对象,若符合栈分配,则分配至线程栈,若不太大,分配至TLAB区,比较大,分配至Eden,线程私有空间,默认每个线程1%私有,避免争抢资源。

Young 和 old均属于堆空间,即新new出来的对象存在于内存中,栈空间可存,堆空间也可存。

在进行gc turning (gc调优)时,会对jvm设置垃圾收集器的组合。jvm有内存分代模型,用于分代垃圾回收算法,分为Eden区,s1(幸存区,标记复制算法执行),s2区,old区,比例1.8中,Young(包括Eden,s1,s2称为young区)和 old(老年区)默认比例为1:2,young区中Eden和s1,s2的默认比例为8:1:1。

在进行垃圾回收的时候,Eden和s1,s2的容量大于50%时,会进行一次垃圾回收,将部分未回收对象移入old区,Eden区放不下新对象进行一次垃圾回收,将未回收对象移入s1幸存区,Eden区有新对象过来,S1放不下时,s1和s2进行标记压缩,将部分年长幸存对象放入old区,在进行垃圾回收的时候,如果young区有对像放不下,直接放入old区,叫做分配担保。在old区不能放入新的从young区过来的对象时,进行fullGc,fullGc是一个概念,还是组合的垃圾收集器进行回收,组合的垃圾回收器,会对old区进行回收,使用标记清除,压缩等算法,进行回收。

CMS垃圾收集器在1.4以后出现,在gc上具有划时代的意义,可以通过设置Old区阈值(默认92%,即old区达到92%进行FGC,GC调优要尽量减少FGC的次数和时间)来调优CMS垃圾收集器。