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. PyQt(Python+Qt)学习随笔:Qt Designer中toolBar的orientation属性和iconSize属性

    orientation属性 orientation属性用于确认工具栏是水平方向还是垂直方向,这个属性对于QMainWindow中的工具栏来说没有意义,因为QMainWindow中的工具栏支持在上下左右 ...

  2. PyQt(Python+Qt)学习随笔:Designer中QDialogButtonBox确认clicked信号是哪个按钮发送的方法

    一.引言 QDialogButtonBox本身只提供4种信号,分别是accepted.rejected.clicked和helpRequested,在<PyQt(Python+Qt)学习随笔:D ...

  3. neo4j数据库数据转移,从阿里云转移到windows服务器

    1.从阿里云迁移neo4j时需停掉neo4j数据库,在neo4j的bin目录下输入 ./neo4j stop 2.将数据备份到一个文件中 ./neo4j-admin dump --database=g ...

  4. MySQL日期和时间函数汇总

    本文基于MySQL8.0 本文介绍MySQL关于日期和时间操作的函数. 日期和时间函数 函数 描述 ADDDATE() 给日期值添加时间值 ADDTIME() 添加time CONVERT_TZ() ...

  5. C++ cin.ignore() 的使用

    cin.sync()的功能是清空缓冲区,而cin.ignore()虽然也是删除缓冲区中数据的作用,但其对缓冲区中的删除数据控制的较精确. 有时候你只想取缓冲区的一部分,而舍弃另一部分,这是就可以使用c ...

  6. schema与数据类型优化-高性能mysql

    总结作为开发人员重点注意的内容!这是一篇有关高性能MYSQL第四章schema相关的笔记. 0.前言 在项目中,数据库表列有两个text字段,用来存储大文本,在数据规模达到40万后,如果查询没命中索引 ...

  7. docker(专业版) 安装过程报错

    1.安装docker Desktop时遇到的错误 1.1安装Docker Desktop报错:WSL 2 installation is incomplete 解决: # 更新版本 https://b ...

  8. Linux 设置日期时间

    linux 日期设置 直接设置日期和时间 date -s 2019-02-11 date -s 12:12:12 date -s "2019-02-11 12:12:12"

  9. ElasticSearch中head插件的简单用法

    1.首先在左侧打开Query栏. 2.Query下方的第一栏是分别输入es的地址.端口号.index.type. 3.Query下方的第二栏是输入将要执行的方式,旁边的下拉框是辅助选择执行的类型,如图 ...

  10. 深度图解Redis Cluster原理

    不想谈好吉他的撸铁狗,不是好的程序员,欢迎微信关注「SH的全栈笔记」 前言 上文我们聊了基于Sentinel的Redis高可用架构,了解了Redis基于读写分离的主从架构,同时也知道当Redis的ma ...