1.minor gc 也需要STW,只不过正常情况下 minor gc STW时间非常短,所以很多人误以为没有STW. 这里的正常情况是,Eden 区产生的新对象大部分被回收了,不需要拷贝。
2.Minor GC 采用的是标记复制算法,具体过程如下图:
3.为什么minor gc 比full gc 快?
minor gc 只针对 young 区, full gc 针对所有区,包括young gen、old gen、perm gen.
minor gc 和 full gc 都是从 gc root 开始扫描的.
minor gc root 是指:当前线程stack+ Dirty cards.
full gc root 是指:当前线程stack+ Perm Gen .
full gc 扫描stack 时候会递归扫描整个所有对象以及他们引用,是全量扫描。
minor gc 扫描对象时候和full gc 类似,只不过当遍历的对象是old 区的对象就停止进一步遍历了,这样就就跳过了所有old 对象扫描,扫描数量大大减少(只是young 区的),但这样会产生一个问题:
就是如果young 区的某个对象只被old 应用,那么该对象就扫描不到成了需要被回收的。这时候Dirty cards 排上了用场,dirty card 里面记录了old 区所有引用了young 区的对象,所以扫描
一次dirty card 问题就解决了。
总结一下:就是minor gc 需要扫描的对象很少,扫描后需要复制有效对象也很少,所以速度很快。full gc 需要做全量扫描标记清除,很耗时。
参考资料:
https://stackoverflow.com/questions/19154607/how-actually-card-table-and-writer-barrier-works
https://plumbr.io/handbook/garbage-collection-in-java/minor-gc-major-gc-full-gc/minor-gc
原文:https://www.cnblogs.com/kevin7234/p/10644654.html