首页 > 其他 > 详细

jvm minor gc 为什么比 full gc 快很多

时间:2019-04-02 19:24:41      阅读:258      评论:0      收藏:0      [点我收藏+]

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

 

参考资料:

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

 

jvm minor gc 为什么比 full gc 快很多

原文:https://www.cnblogs.com/kevin7234/p/10644654.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!