文档章节

如何选择合适的 GC 时间 —— USER, SYS, REAL?

九州暮云
 九州暮云
发布于 2016/07/19 16:11
字数 1056
阅读 2364
收藏 16

在 GC 日志文件中,每个 GC 事件有三种类型的时间:

  • user

  • sys

  • real

例如:

[Times: user=11.53 sys=1.38, real=1.03 secs].

在我们开始分析 GC 日志的时候,会遇到两个问题:

1、usersysreal 三者之间有什么不同?

2、我们该使用哪一个时间来分析日志?

Unix 的 Time 命令:

在弄清楚 GC 时间之前,我们先花几分钟来看看 Unix 的 time 命令。以下是使用该命令的一个示例:

time ls

命令执行之后,你会看到控制台输出这些信息:

输入图片说明

在上图中,time ls 命令首先输出 ls 命令的执行结果,列出了当前目录下的所有目录/文件:

输入图片说明

紧接着我们会看到 ls 命令执行的时间:

输入图片说明

注意这里显示出了 realusersys 三个时间,这些时间与我们在 GC 日志里看到的大致相同。现在我们来看看 StackOverflow 上提供的关于这些时间的解释:

Real is wall clock time – time from start to finish of the call. This is all elapsed time including time slices used by other processes and time the process spends blocked (for example if it is waiting for I/O to complete).

User is the amount of CPU time spent in user-mode code (outside the kernel) within the process. This is only actual CPU time used in executing the process. Other processes and time the process spends blocked do not count towards this figure.

Sys is the amount of CPU time spent in the kernel within the process. This means executing CPU time spent in system calls within the kernel, as opposed to library code, which is still running in user-space. Like ‘user’, this is only CPU time used by the process.

通过上面的这段英文我们可以知道这三个时间的概念:

  • real —— 程序从开始到结束所用的时钟时间。这个时间包括其他进程使用的时间片和进程阻塞的时间(比如等待 I/O 完成)。

  • user —— 进程执行用户态代码(核心之外)所使用的时间。这是执行此进程所使用的实际 CPU 时间,其他进程和此进程阻塞的时间并不包括在内。在垃圾收集的情况下,表示 GC 线程执行所使用的 CPU 总时间。

  • sys —— 进程在内核态消耗的 CPU 时间,即在内核执行系统调用或等待系统事件所使用的 CPU 时间。

user + sys 时间告诉我们程序执行实际使用的 CPU 时间。注意这里指所有的 CPU,因此如果在进程里有多个线程的话,这个时间可能会超过 real 所表示的时钟时间。

Java GC 时间

上面我们解释了三个时间的概念,接下来我们用一些例子来更好地说明这些概念:

例1:

[Times: user=11.53 sys=1.38, real=1.03 secs]

在这个例子中,user + sys 时间的和比 real 时间要大,这主要是因为日志时间是从 JVM 中获得的,而这个 JVM 在多核的处理器上被配置了多个 GC 线程,由于多个线程并行地执行 GC,因此整个 GC 工作被这些线程共享,最终导致实际的时钟时间(real)小于总的 CPU 时间(user + sys)。

例2:

[Times: user=0.09 sys=0.00, real=0.09 secs]

上面的例子中的 GC 时间是从 Serial 垃圾收集器 (串行垃圾收集器)中获得的。由于 Serial 垃圾收集器是使用单线程进行垃圾收集的,因此 real 时间等于 usersys 时间之和。

总结

在做性能优化时,我们一般采用 real 时间来优化程序。因为最终用户只关心点击页面发出请求到页面上展示出内容所花的时间,也就是响应时间,而不关心你到底使用了多少个 GC 线程或者处理器。但并不是说 sysuser 两个时间不重要,当我们想通过增加 GC 线程或者 CPU 数量来减少 GC 停顿时间时,可以参考这两个时间。

参考资料:

GC LOGGING – USER, SYS, REAL – WHICH TIME TO USE? & GANDHI

Understanding Garbage Collection Logs

© 著作权归作者所有

共有 人打赏支持
九州暮云
粉丝 61
博文 154
码字总数 102974
作品 0
海淀
高级程序员
私信 提问
浅谈 G1 GC 日志格式

在 Java9 中,G1 GC 将成为默认的垃圾收集器,G1 垃圾收集器的关键特性之一是能够在不牺牲吞吐量的同时,限制 GC 暂停时间(即可以设置所需的最大停顿时间)。 由于 G1 GC 正在逐渐成为默认的垃...

丢失的羊羔
2016/07/12
522
2
Java中的垃圾回收

Java中的垃圾回收 前文中对标记删除算法的介绍更多还是偏理论性质的。实践中,为了更好地满足现实的场景及需求,还需要对算法进行大量的调整。举个简单的例子,我们来看下JVM需要记录哪些信息...

nj-zhangmq
2016/12/16
9
0
jvm老年代无法回收

系统运行一天就会卡,以下是gc日志,取四部分,分别是,虚拟机刚启动,运行半天左右,系统卡顿时,系统卡顿后,各取50行 另:虚拟机配置 为-Xms1G -Xmx6G,其他默认。一般不重启的话,两天就...

琴麻岛
2017/06/07
702
5
检查resin的gc相关log的脚本(nagios插件版)-python

输入:logpath-日志位置;间隔监控时间(单位为分钟);fullgccount-fullgc次数报警值;gcinterval-gc间隔时间报警值;gc_count-gc次数报警值 输出:当被检查log中有任一项报警内容大于报警值的时候,...

跬步
2013/03/20
0
0
JVM中奇怪的Full GC, 大家帮忙分析下

下面的gc log中的full gc是怎么触发的,理解不了,请大神看看~ 2015-02-03T14:40:12.029+0800: 470.095: [GC [PSYoungGen: 1271672K->13218K(3940864K)] 1374109K->115656K(8135168K), 0.0......

webexpressor
2015/02/03
1K
7

没有更多内容

加载失败,请刷新页面

加载更多

C++ vector和list的区别

1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造...

shzwork
29分钟前
1
0
Spring之invokeBeanFactoryPostProcessors详解

Spring的refresh的invokeBeanFactoryPostProcessors,就是调用所有注册的、原始的BeanFactoryPostProcessor。 相关源码 public static void invokeBeanFactoryPostProcessors(Configu......

cregu
昨天
1
0
ibmcom/db2express-c_docker官方使用文档

(DEPRECIATED) Please check DB2 Developer-C Edition for the replacement. What is IBM DB2 Express-C ? ``IBM DB2 Express-C``` is the no-charge community edition of DB2 server, a si......

BG2KNT
昨天
0
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
3
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部