QQA: jstat gcutil 的输出是什么意思

当 Java 程序有性能问题时,尤其是响应时间有突然变化时,最好第一时间查看 GC 的状态。一般用 jstat -gcutil <pid> 1s 来查看,那么它的输出又是什么含义呢?

输出样例

一般会用两种方式调用 jstat,一种看百分比,一种看具体数值(KB)。

例如 jstat -gcutil <pid> 1s 会每隔一秒输出内存相关信息,示例输出如下:

S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
0.00 0.00 34.47 44.29 93.05 83.49 10 0.036 2 0.117 0.153
0.00 0.00 45.70 44.29 93.05 83.49 10 0.036 2 0.117 0.153
0.00 0.00 58.12 44.29 93.05 83.49 10 0.036 2 0.117 0.153

而 jstat -gc <pid> 1s 会输出具体占用的数值,如下(比较长):

S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU      YGC     YGCT    FGC    FGCT     GCT
4608.0 6656.0 0.0 0.0 62464.0 48011.4 30720.0 13605.8 35456.0 32991.3 10 0.036 2 0.117 0.153
4608.0 6656.0 0.0 0.0 62464.0 49261.5 30720.0 13605.8 35456.0 32991.3 10 0.036 2 0.117 0.153
4608.0 6656.0 0.0 0.0 62464.0 49261.5 30720.0 13605.8 35456.0 32991.3 10 0.036 2 0.117 0.153

要理解上面输出的具体含义,需要了解 Java 的内存与 GC 的过程。

GC 过程简要梳理

下图是 GC 过程的概要(图片来源 plumbr.io):

如上图,JVM 中的内存中的各个区域和作用如下(这里只是概述,细节麻烦查阅相关材料):

  • Eden(伊甸园):创建新对象时会从中分配内存。内存不足时,触发 Young GC。不再被引用的对象将被抛弃,还被引用的对象会被复制到 Survivor 区。
  • Survivor(幸存者):有两个 Survivor 区,GC 时会来回地把内存从其中一个区复制到另一个,交替进行。这里存储的是一些“年轻”的对象,多次 GC (默认 15 次)后这些对象还停留在 Survivor 区,则认为它们会被长期引用,Survivor 空间不足时会将它们移动到“老生代”中。来回复制的过程中除了释放内存,还起到整理内存碎片的作用。
  • Tenured(终生代)、也称 Old Generation(老生代):保留那些“长期”被引用的对象。因此该区域只在 Full GC 的时候才会被整理。
  • PermGen/MetaSpace,Java 8 前是 PermGen,Java 8 后改成 MetaSpace。用来存储诸如加载的类、字符串常量等元信息,与 GC 无关。

另外:Eden 与 Survivor 统称“年轻代”,它们引发的 GC 也称 “Young GC”。Young GC 通常比 Full GC 快很多,如果系统有卡顿,一般需要关注 Full GC。

jstat 输出含义

了解了 GC 的过程,其实 jstat 的输出通过查文档 man jstat 就可以找到。这里权且作个翻译:

-gcutil 的输出如下

Column Description
S0 第 0 个 survivor(幸存区)使用的百分比
S1 第 1 个 survivor(幸存区)使用的百分比
E Eden 区使用内存的百分比
O 老生代内存使用的百分比
P/M PermGen/MetaSpace 的内存使用百分比
YGC 程序启动以来 Young GC 发生的次数
YGCT 程序启动以来 Young GC 共消耗的时间(s)
FGC 程序启动以来 Full GC 发生的次数
FGCT 程序启动以来 Full GC 共消耗的时间(s)
GCT 程序启动以来 GC 的总用时(s)

-gc 的输出如下

Column Description
SOC 第 0 个 Survivor 区的总空间 (KB).
S1C 第 1 个 Survivor 区的总空间 (KB).
S0U 第 0 个 Survivor 区已使用的空间 (KB).
S1U 第 1 个 Survivor 区已使用的空间 (KB).
EC Eden 区的总空间 (KB).
EU Eden 区已使用的空间 (KB).
OC OldGen 的总空间 (KB).
OU OldGen 已使用的空间 (KB).
PC/MC PermGen/MetaSpace 的总空间 (KB).
PU/MU PermGen/MetaSpace 使用的空间 (KB).
YGC 程序启动以来 Young GC 发生的次数
YGCT 程序启动以来 Young GC 共消耗的时间(s)
FGC 程序启动以来 Full GC 发生的次数
FGCT 程序启动以来 Full GC 共消耗的时间(s)
GCT 程序启动以来 GC 的总用时(s)

jstat gcutil的更多相关文章

  1. jstat -gcutil pid millsec

      1. jstat -gc pid 可以显示gc的信息,查看gc的次数,及时间. 其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc ...

  2. jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)

    文章同步发布于github博客地址,阅读效果更佳,欢迎品尝 运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎 ...

  3. Jstack Jmap jstat

    jstack jmap jstat 代码,这里以这个为例怎样使用jstack诊断Java应用程序故障 public class DeadLock { public static void main(S ...

  4. JVM学习之jstat使用方法

    Jstat是JDK自带的一个轻量级工具,主要用JVM内建的指令对java应用程序的资源和性能进行实时的监控. 基本语法 jstat <option> [-t] [-h] <pid&g ...

  5. Linux使用jstat命令查看jvm的GC情况

    Linux使用jstat命令查看jvm的GC情况 http://www.open-open.com/lib/view/open1390916852007.html http://www.aiuxian ...

  6. Jstat在分析java的内存GC时的应用

    jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量.使用时,需加上查看进程的进程id,和所选参数. 执行:cd $JAVA_HOME/bin中执行jstat,注意j ...

  7. Java 7 jstat – JVM Statistics Monitoring Tool【翻译】

    原文地址:Java 7 jstat 本文内容 语法 参数 描述 虚拟机标识符 选项 一般选项 输出选项 示例 先发出来,然后慢慢翻译~ 语法 jstat [ generalOption | outpu ...

  8. jstat使用

    jstat -gcutil pid 统计gc信息统计.其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间.

  9. JVM值内存垃圾回收监控之jstat

    如何判断JVM垃圾回收是否正常?一般的top指令基本上满足不了这样的需求,因为top主要监控的是总体的系统资源,很难定位到java应用程序. Jstat是JDK自带的一个轻量级小工具.全称“Java ...

随机推荐

  1. 关于老猿Python系列文章发布网址变化的说明

    老猿Python系列文章最开始在新浪发布,后逐渐开通了CSDN.博客园和简书三个网址,但老猿一来工作忙,二来Python需要学习的内容太多,因此实在没时间同时维护这么多博客,事实上除了CSDN其他网站 ...

  2. 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法

    第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一.    案例说明 本节定义了类Sta ...

  3. 第15.4节 PyCharm程序代码检测功能介绍

    老猿使用PyCharm有将近一个月了,发现PyCharm并不能很好的完成语法检查,有时运行时突然终止,仔细核查却发现是基本的语法错误,不过有次无意中移动鼠标到代码最右边的边框时发现其实PyCharm有 ...

  4. PyQt(Python+Qt)学习随笔:什么是信号绑定(Unbound and Bound Signals)?

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 1.概述 信号的绑定是由在类的实例变量中第一次通过类实例的方式(即"self.信号&quo ...

  5. COMMENT SQL二次注入

    这题目太顶了进去随便发个贴,出现登录已经提示用户名和密码了,弱密码登录(得自己去爆破)zhangwei666即可 没啥思路,扫下目录试试,kali的dirb扫到.git泄露githacker得到源码看 ...

  6. CVE申请+挖掘指南

    CVE的全称是"Common Vulnerabilities and Exposures"翻译成中文就是"公共漏洞和披露" 可以简单理解跟国内CNVD的通用漏洞 ...

  7. 【SDOI2017】相关分析(线段树)

    Description 你需要维护一个长度为 \(n\) 的实数对的序列,第 \(i\) 个元素为 \((x_i, y_i)\).现有 \(m\) 次操作: \(\texttt{1 L R}\):设区 ...

  8. 测试web-view,实现小程序和网页之间的切换

    官方有句提醒:个人类型与海外类型的小程序暂不支持使用 测试条件: 1.小程序后台管理中,进入"开发设置",设置一个业务域名(注意:不是设置服务器域名).比如 https://tes ...

  9. emlog仿小刀网模板附文章

      附带了几百篇文章,搭建出来非常漂亮,喜欢的可以下载一份看看!下载地址:https://lengleng.lanzous.com/iNQayezebsh

  10. proxySQL with SemiSync

    环境信息 hostname IP port role comm ms81 192.168.188.81 3399 master ms82 192.168.188.82 3399 slave ms83 ...