java - Minor GC 和 Full GC 同时进行?

标签 java garbage-collection jvm concurrent-mark-sweep

这是一段显示完整 CMS GC 事件的 GC 日志:

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 事件:

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] 

可以吗? minor GC 会阻塞 full GC 吗?

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

最佳答案

在您的情况下,使用的 GC 算法是:-

Parallel New for Young + Concurrent Mark and Sweep (CMS) for the Old Generation

CMS 运行时似乎有一个小的 GC 事件,可以吗?
是的,ParNew 和 CMS 可以并行运行。

minor GC 会阻塞 full GC 吗?
是的,并发 CMS 集合被 ParNew 次要集合“中断”。 新生代的收集可以在并发收集老年代的任何时候发生。在这种情况下,主要收集将与次要 GC 事件交错

这能解释我们看到的非常高的系统时间吗?
您需要检查 GC 中 Stop-the-world 事件的频率和持续时间。

  1. CMS初始标记
  2. CMS 最后的评论
  3. 帕纽

通过查看您的日志,我可以确定您的次要 GC (ParNew) 花费了太多时间才能完成。
5.7752364 秒:垃圾收集器标记和复制新生代中的 Activity 对象所花费的时间+与 ConcurrentMarkSweep 收集器的通信开销

reference对于 Java GC,值得一读。

关于java - Minor GC 和 Full GC 同时进行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41401862/

相关文章:

java - 尝试编译基本 JNI 测试代码时 VS2010 出错

java - GC问题: array of 10 ints a single object or 10 objects?

java - 无法打开套接字文件: target process not responding or HotSpot VM not loaded

java代码执行在没有断点和正常运行的调试中产生不同的结果。 ExecutorService 坏了吗?

jvm - 任意 JVM 行为

java - 封闭类型的静态嵌套子类仍然可以引用私有(private)字段成员,为什么?

java - 在多个服务器实例的情况下,ChildEventListener 的所有实例都会触发吗?

java - 如何在 Java 中从一个字符集解码文本并将其转换为另一个字符集?

java - JVM - 弱引用是否在次要 GC 中收集?

java - 如何使用 maven jvmArg 解决 "GC overhead limit exceeded"?