1.minor gc 也须要STW,只不过正常状况下 minor gc STW时间很是短,因此不少人误觉得没有STW. 这里的正常状况是,Eden 区产生的新对象大部分被回收了,不须要拷贝。html
2.Minor GC 采用的是标记复制算法,具体过程以下图:java
3.为何minor gc 比full gc 快?算法
minor gc 只针对 young 区, full gc 针对全部区,包括young gen、old gen、perm gen.jvm
minor gc 和 full gc 都是从 gc root 开始扫描的.ide
minor gc root 是指:当前线程stack+ Dirty cards.线程
full gc root 是指:当前线程stack+ Perm Gen .htm
full gc 扫描stack 时候会递归扫描整个全部对象以及他们引用,是全量扫描。对象
minor gc 扫描对象时候和full gc 相似,只不过当遍历的对象是old 区的对象就中止进一步遍历了,这样就就跳过了全部old 对象扫描,扫描数量大大减小(只是young 区的),但这样会产生一个问题:blog
就是若是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