jvm minor gc 为何比 full gc 快不少

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 须要作全量扫描标记清除,很耗时。

 

参考资料:

http://blog-archive.griddynamics.com/2011/06/understanding-gc-pauses-in-jvm-hotspots.html?view=sidebar

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

相关文章
相关标签/搜索