首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >小GC和完全GC同时进行?

小GC和完全GC同时进行?
EN

Stack Overflow用户
提问于 2016-12-30 19:43:04
回答 3查看 712关注 0票数 3

下面是一段GC日志,显示完整的CMS GC事件:

代码语言:javascript
复制
2016-12-29T22:44:34.741-0500: 27572.982: [GC (CMS Initial Mark) [1 CMS-initial-mark: 2508212K(23068672K)] 2931097K(26843584K), 0.0213349 secs] [Times: user=0.22 sys=0.00, real=0.02 secs] 
2016-12-29T22:44:34.763-0500: 27573.004: [CMS-concurrent-mark-start]
2016-12-29T22:44:36.013-0500: 27574.254: [CMS-concurrent-mark: 0.208/1.250 secs] [Times: user=3.07 sys=0.10, real=1.25 secs] 
2016-12-29T22:44:36.014-0500: 27574.255: [CMS-concurrent-preclean-start]
2016-12-29T22:44:36.061-0500: 27574.303: [CMS-concurrent-preclean: 0.047/0.048 secs] [Times: user=0.12 sys=0.00, real=0.05 secs] 
2016-12-29T22:44:36.062-0500: 27574.303: [CMS-concurrent-abortable-preclean-start]
 CMS: abort preclean due to time 2016-12-29T22:44:41.339-0500: 27579.580: [CMS-concurrent-abortable-preclean: 4.084/5.277 secs] [Times: user=9.53 sys=0.46, real=5.27 secs] 
2016-12-29T22:44:41.356-0500: 27579.598: [GC (CMS Final Remark) [YG occupancy: 3509179 K (3774912 K)]2016-12-29T22:44:41.357-0500: 27579.598: [Rescan (parallel) , 0.0816014 secs]2016-12-29T22:44:41.438-0500: 27579.680: [weak refs processing, 0.0000347 secs]2016-12-29T22:44:41.438-0500: 27579.680: [class unloading, 0.0292451 secs]2016-12-29T22:44:41.468-0500: 27579.709: [scrub symbol table, 0.0069857 secs]2016-12-29T22:44:41.475-0500: 27579.716: [scrub string table, 0.0010933 secs][1 CMS-remark: 2508212K(23068672K)] 6017391K(26843584K), 0.1194737 secs] [Times: user=2.18 sys=0.00, real=0.12 secs] 
2016-12-29T22:44:41.477-0500: 27579.718: [CMS-concurrent-sweep-start]
2016-12-29T22:44:41.618-0500: 27579.860: [GC (Allocation Failure) 2016-12-29T22:44:41.619-0500: 27579.860: [ParNew: 3579431K->419392K(3774912K), 5.7752364 secs] 6080306K->3302237K(26843584K), 5.7769753 secs] [Times: user=4.70 sys=8.50, real=5.78 secs] 
2016-12-29T22:44:47.698-0500: 27585.940: [CMS-concurrent-sweep: 0.230/6.221 secs] [Times: user=5.76 sys=8.55, real=6.22 secs] 
2016-12-29T22:44:47.699-0500: 27585.940: [CMS-concurrent-reset-start]
2016-12-29T22:44:47.717-0500: 27585.958: [GC (System.gc()) 2016-12-29T22:44:47.718-0500: 27585.959: [ParNew: 527384K->155025K(3774912K), 0.7351766 secs] 3405551K->3441841K(26843584K), 0.7366514 secs] [Times: user=5.61 sys=1.44, real=0.74 secs] 
2016-12-29T22:44:48.503-0500: 27586.744: [CMS-concurrent-reset: 0.049/0.804 secs] [Times: user=5.81 sys=1.45, real=0.81 secs] 

当CMS运行时,似乎有一个小GC事件:

代码语言:javascript
复制
2016-12-29T22:44:41.618-0500: 27579.860: [GC (Allocation Failure) 2016-12-29T22:44:41.619-0500: 27579.860: [ParNew: 3579431K->419392K(3774912K), 5.7752364 secs] 6080306K->3302237K(26843584K), 5.7769753 secs] [Times: user=4.70 sys=8.50, real=5.78 secs] 

这样可以吗?小GC会阻塞整个GC吗?

这能解释我们所看到的非常高的系统时间吗?(sys=8.55 secs,sys=8.50 secs)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-30 20:30:58

就您的情况而言,所使用的GC算法如下:

年轻+并发标记与扫描的并行新一代(CMS)

在运行CMS时似乎有一个小GC事件,可以吗?

是的,ParNew和CMS可以并行运行。

小GC是否阻塞了完整的GC?

是的,并发CMS集合被ParNew小集合“中断”。年轻一代的收集可以随时随地发生在并发收集老一代。在这种情况下,主要集合将与次要GC事件交织在一起。

,这能解释我们所看到的非常高的系统时间吗?

您需要在GC中检查停止世界事件的频率和持续时间。

  1. CMS惯性标记
  2. CMS结束语
  3. ParNew

通过查看您的日志,我可以看出您的小GC (ParNew)要花费太多的时间才能完成。

5.7752364秒:垃圾收集器用ConcurrentMarkSweep收集器标记和复制年轻Generation+communication中的活动对象所花费的时间

不错的Java 参考文献,值得一读。

票数 2
EN

Stack Overflow用户

发布于 2016-12-30 20:41:18

当然,年轻的集合可以在旧的集合中发生。通常,这不是一个大问题,但在CMS评论阶段,直接跟随一个年轻的集合(或其他方式,因此两者都是停止世界暂停),它可能会损害性能。CMS将试图通过计算下一个年轻收集将发生的时间来避免这种情况,但这只是理论。

票数 0
EN

Stack Overflow用户

发布于 2016-12-30 22:46:08

如果年轻GC运行在CMS阶段之间,这是绝对可以的。在CMS初始标记或CMS备注之前做一个年轻的收集,甚至可以减少主要GC的停止世界停顿。

不正常的地方是执行GC时大量的sys时间(在内核中花费的CPU时间)。这通常不应该发生,因为垃圾收集主要是用户空间的工作。

检查topperf等,找出导致高系统时间的原因。这通常与内存问题有关:交换或透明的大页碎片整理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41401862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档