JVM GC学习记录

垃圾标记算法:

引用计数

解决不了垃圾对象循环引用问题。

root扫描(可达性分析)

从根对象(线程、main函数、静态变量、常量)扫描。

三色标记

黑:其下所有子树,引用均被标记完成,是存活的最终状态。

灰:其下所有子树,但引用的对象尚未完全检查,是存活的过渡状态。

白:对象未被标记,默认初始状态,标记结束后仍为白色的对象将被回收。

JVM GC学习记录_第1张图片

标记时会STW扫描根节点,然后标记线程与业务线程并行存在;

会产生

情况2,业务线程让灰色对白色的引用消失,白色为浮动对象,但是,标记线程下一次CPU切换重新扫描就可解决。

情况3,灰色对白色的引用消失的同时,黑色对白色的引用增加了,此时就需要更正黑色为灰色(如情况4),不然白色就永远不会扫描到,产生漏标,被当成垃圾回收,导致业务线程出现问题。

颜色指针

??

垃圾回收算法:

标记-清除

耗时最短,但会产生碎片。

JVM GC学习记录_第2张图片

标记-复制

无碎片产生,但不会充分利用内存空间。

JVM GC学习记录_第3张图片

标记-整理

耗时较长,无碎片,不浪费内存空间。

JVM GC学习记录_第4张图片

分区-整理

JVM GC学习记录_第5张图片

分页-整理:

??

垃圾回收器发展史

发展是根据可使用的内存大小演进的。

刚开始时,可使用的内存:几兆 ~ 十几兆

单线程的垃圾回收就可以,此时垃圾回收器还是分代的,新1(X8 : S1 : S1): 老3。

由于内存空间较小,单线程就可以短时间标记清理。

有:serial 回收器

之后,可使用的内存:几百兆 ~ 1G

单线程无法短时间内进行清理,引入多线程。

有:paralled 回收器

上面两种回收器,清理垃圾会STW

现代,可使用的内存:1G ~ 几G

此时,引用更多的线程,无法满足场景,反而由多线程频繁进行CPU调度,导致性能下降。

引用concurrent概念,回收线程与业务线程同时存在,边使用边清理。

有:CMS,G1

CMS有bug:

在更正三色标记算法情况4时,

标记线程1,标记灰色对象时,假如被标记的对象有,引用1,引用2;

已经标记完引用1,当正在标记引用2时,由于CPU调度,线程挂起,

业务线程把引用1重新进行引用;

此时CPU调度切回标记线程1,由于对象一直处于灰色,认为引用1已经标记完,当标记完引用2时,会变成黑色,导致漏标。

JVM GC学习记录_第6张图片

ps:以上是学习记录,本人对此也有疑问?

1,引用1,会不会被更正为灰色?

2,是否有标记线程2,对其进行重新扫描处理?

有知道的欢迎留言。

JDK5、JDK6、JDK7,没得选,只能使用CMS应用于大型系统。

JDK7中已经引用G1,但是不成熟,所以不能使用。

你可能感兴趣的:(JVM,GC,jvm,学习,java,GC)