GC 深入(小白,对gc有一个进一步的了解)

垃圾回收器的搭配 一般固定

一般这年轻代垃圾回收器,老年代垃圾回收器,如上图搭配着使用

1.8呢默认就是最后边那哥俩

jvm调优 一个就是增加吞吐量 一个就是减少STW的时间。

三色标记算法(理解根可达算法) 并发的可达性分析

有黑白灰三个颜色

最开始的颜色都是白色

刚找到这个对象的时候,把他标记成灰色,然后他的孩子级别的对象都找到时。 把他标记成黑色。他的孩子就是灰色了。

关于可达性分析的扫描过程,读者不妨发挥一下想象力,把它看作对象图上一股以灰色为波峰的

波纹从黑向白推进的过程,如果用户线程此时是冻结的,只有收集器线程在工作,那不会有任何问

题。但如果用户线程与收集器是并发工作呢?收集器在对象图上标记颜色,同时用户线程在修改引用关系------即修改对象图的结构,这样可能出现两种后果。一种是把原本消亡的对象错误标记为存活,这不是好事,但其实是可以容忍的,只不过产生了一点逃过本次收集的浮动垃圾而已,下次收集理掉就好。另一种是把原本存活的对象错误标记为已消亡,这就是非常致命的后果了,程序肯定会因此发生错误

并发出现"对象消失"问题的示意

Wilson于1994年在理论上证明了,当且仅当以下两个条件同时满足时,会产生"对象消失"的问

题,即原本应该是黑色的对象被误标为白色:
·赋值器插入了一条或多条从黑色对象到白色对象的新引用;
·赋值器删除了全部从灰色对象到该白色对象的直接或间接引用。

因此,我们要解决并发扫描时的对象消失问题,只需破坏这两个条件的任意一个即可。由此分别

产生了两种解决方案:增量更新(Incremental Update)和原始快照(Snapshot At The Beginning,

SATB)。

增量更新要破坏的是第一个条件,当黑色对象插入新的指向白色对象的引用关系时,就将这个新

插入的引用记录下来,等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象为根,重新扫描一次。这可以简化理解为,黑色对象一旦新插入了指向白色对象的引用之后,它就变回灰色对象了。

原始快照要破坏的是第二个条件,当灰色对象要删除指向白色对象的引用关系时,就将这个要删

除的引用记录下来,在并发扫描结束之后,再将这些记录过的引用关系中的灰色对象为根,重新扫描一次。这也可以简化理解为,无论引用关系删除与否,都会按照刚刚开始扫描那一刻的对象图快照来进行搜索。

以上无论是对引用关系记录的插入还是删除,虚拟机的记录操作都是通过写屏障实现的。在

HotSpot虚拟机中,增量更新和原始快照这两种解决方案都有实际应用,譬如,CMS是基于增量更新来做并发标记的,G1、Shenandoah则是用原始快照来实现。

相关推荐
爱学java的ptt17 分钟前
jvm笔记
jvm·笔记
DKPT16 小时前
ZGC和G1收集器相比哪个更好?
java·jvm·笔记·学习·spring
低客的黑调18 小时前
为你的项目选择一个适合的[垃圾收集器]
java·jvm·算法
xu_yule21 小时前
Linux_14(多线程)线程控制+C++多线程
java·开发语言·jvm
豆奶特浓61 天前
Java面试生死局:谢飞机遭遇在线教育场景,从JVM、Spring Security到AI Agent,他能飞吗?
java·jvm·微服务·ai·面试·spring security·分布式事务
Boop_wu1 天前
[Java EE] 多线程进阶(JUC)(2)
java·jvm·算法
3***31211 天前
java进阶1——JVM
java·开发语言·jvm
打工人你好3 天前
如何设计更安全的 VIP 权限体系
java·jvm·安全
unclecss3 天前
把 Spring Boot 的启动时间从 3 秒打到 30 毫秒,内存砍掉 80%,让 Java 在 Serverless 时代横着走
java·jvm·spring boot·serverless·graalvm
q***2513 天前
java进阶1——JVM
java·开发语言·jvm