成为Java GC专家 第二篇(译)

成为Java GC专家 第二篇(译)

如何监控Java垃圾回收(译)

原文how-to-monitor-java-garbage-collection

这是”成为Java GC专家”系列的第2篇,
在第一篇文章中了解Java GC我们学习了各种GC算法,关于Gc如何工作,年轻代和老年代是什么,在新的JDK7中,你应该知道5种GC类型,和这些GC类型对应的性能影响

在本文中,我将解释JVM如何实时运行GC

什么是GC监控

垃圾回收监控是搞清楚JVM如何运行GC的过程,比如,我们可以发现:

  1. 当一个年轻代的对象移动到老年代
  2. 或者是‘stop-the-world’的事件发生以及它的时长

GC监控jvm是否高效的在运行GC,和检测GC调优是否有必要 基于以上信息,我们可以修改应用程序或者修改GC方法(GC调优)

如何监控GC

有不同的监听方法,但是唯一的区别就是如何显示GC操作信息,GC是由Jvm完成的,而GC监控工具是提取到了JVM提供的GC信息,所以无论你如何监控GC,都将获得相同的结果。因此 你不需要学会所有有关GC的方法,但是需要一点点时间来学习不同监控GC的方法 知道这些可以帮助你在不同的情况和环境中使用

在以下列出的JVM选项都是不能普遍使用的 ,换言之就是不一样的产品是不能使用一样的选项的,无论HVM商是什么(HVM是什么?)
,这是因为没有一个公开的公共的GC标准,在本文例子中我们使用 HotSpot VM(Oracle的JVM),由于NHN中使用的是Oracle(Sun)JVM,应用这些工具中的JVM选项并不困难,我们将在这里解释这些内容

首先,GC监控方法分为CUI和GUI俩种访问接口 ,一个比较典型的CUI GC监控名为“jstat”的单独CUI应用程序,或者在JVM运行时选择一个名为“verbosegc”

GUI GC监控使用单独一个GUI的程序,最重要使用三个“jconsole”,“jvisualvm”,“Visual GC”

让我们进一步了解每种方法

jstat

jstat是一个HotSpot的监控工具,HotSpot的其他监控工具分别为jpsjstatd,有时 你需要所有三种工具监控Java程序

jstat不仅仅只提供GC信息,它还提供类加载器操作信息或即时编译器操作信息 在jstat提供的所有信息中,在本文中,我们将仅仅介绍其监视GC操作信息的功能

jstat在$JDK_HOME/bin ,如果Java和javac没有在命令行中包含单独目录的条件下运行 那么jstat也是一样的

你可以尝试以下命令
此处输入图片的描述

像在本例中,每个实际数据都在以下行进行输出

S0C S1C S0U S1U EC EU OC OU PC.

vmid(虚拟机ID),正如它的名字一样,这是一个虚拟机的ID,可以使用指定的vmid运行本地或者远程的java应用程序。这个vmid如果在本地机器上被称为lvmid(local vmid),通常被称为PID,你可以使用ps命令来写PID或者使用windows任务管理,但是我们使用jps因为pid有时候会跟lvmid不匹配,jps代表java Ps,jps显示vmid和主要方法信息,就像ps显示PID和处理名称

使用JPS来找出想要监控的java应用程序的vmid,然后在jstat中使用参数,如果你单独使用jps, 当一个设备运行几个WAS实例时,只有引导信息会显示。我们建议使用ps -ef | grep java命令以及jps命令

Gc性能数据需要不断观察,因此当运行jstat时,需要尝试定期输出GC监控信息

比如运行 jstat –gc <vmid> 1000(或者1s)将会每隔一秒显示GC监控数据在控制台上.jstat –gc <vmid> 1000 10将每隔一秒显示GC数据显示10次

除了GC还有很多选项,其中GC的相关选项如下

选项名 描述
gc 它显示当前每个堆区的当前大小,和当前使用量(Ede,survivor,old,等等),总共GC执行速,以及GC操作的累计时间
gccapactiy 它显示每个堆区域的最小大小(ms)和最大大小(mx),当前大小和每个区域执行的GC数量。(不显示GC操作的当前使用情况和累积时间。)
gccause 最近一次GC统计和原因
gcnew 显示新区域的GC性能数据。
gcnewcapacity 显示新区域的大小的统计。
gcold 显示旧区域的GC性能数据
gcoldcapacity 显示旧区域的大小统计。
gcpermcapacity 显示永久区域的统计数据。
gcutil 以百分比显示每个堆区的用法。还显示GC执行的总数和GC操作的累积时间。

只要看频率,你可能按照这个-gcutil(或者-gccause),-gc-gccapacity顺序使用

  • -gcutil用于检查堆区域的使用情况,GC执行的数量以及GC操作的总累计时间,
  • -gccapacity选项和其他选项用于检查分配的实际大小。
    您可以使用-gc选项看到以下输出:
    此处输入图片的描述

显示不同的jstat选项显示不同类型的列,这些选项在下面列出,每列信息将在你使用右边的jstat选项之后显示

这里太多不想抄了 关心的同学可以百度到中文版本 Jstat命令详情其1,
Jstat命令详情其2

jstat的优势是只要可以使用控制台,就随时监控远程或者本地的Java应用程序的GC操作数据。在这些项目,使用-gcutil时输出以下结果
在GC调优时,需要注意YGC,YGCT,FGCT,和GCT
此处输入图片的描述
这些选项是十分重要的,因为这些选项显示了你运行GC上花费了多少时间

在这个例子中 YGC是217,YGCT是0.928 算出算术平均值后,你可以看到每个年轻GC需要约4ms 像这种情况的 full gc的时间是33ms

但是计算平均值常常无法帮助我们分析GC问题,这是因为GC运行时间的严重偏差造成的,(比如一种情况,总共的运行时间为0.067秒 但是其中一个是1ms,另外一个GC运行时间为57ms),如果你是为了检测单独的GC时间而不是平均值, 你就需要-verbosegc

-verbosegc

-verbosegc是运行java应用程序的一个jvm选项,虽然不需要任何特别选项jstat就能监听jvm应用程序,而-verbosegc需要在开启时指定, 因此可以将其视为不必要的选项(因为可以使用jstat)

但是,在当gc发生时 使用-verbosegc易于理解的输出,会对粗略的GC信息检测非常有帮助

jstat -verbosegc
监测对象 在可以登录终端的计算机上运行Java应用程序,或者使用jstatd可以连接到网络的远程Java应用程序 只有当-verbogc被指定为JVM启动选项时
输出信息 堆状态(使用情况,最大大小,GC /时间等的次数) GC之前/之后的ew和旧区域的大小以及GC操作时间
输出时间 每个指定的时间 每当GC发生
何时有用 试图观察堆区大小的变化 试图看到单个GC的效果

以下是可以与-verbosegc一起使用的其他选项

  • -XX:+PrintGCDetails
  • -XX:+PrintGCTimeStamps
  • -XX:+PrintHeapAtGC
  • -XX:+PrintGCDateStamps (from JDK 6 update 4)

如果只使用-verbosegc,则默认使用-XX:+PrintGCDetails.-verbosegc并不是只能使用一个选项 可以使用多个混用

当你使用-verbosegc,当minor GC发生时你可以看到以下格式的输出信息
此处输入图片的描述
Collector|用于Minor GC的Collector名
–|–
starting occupancy1|GC之前的年轻区域的大小
ending occupancy1|GC后的年轻区域的大小
pause time1|Java应用程序停止运行次要GC的时间
starting occupancy3|GC之前的堆区总大小
ending occupancy3 |GC后堆面积的总大小
pause time3|Java应用程序停止运行整个堆GC(包括主要GC)的时间

这是一个-verbosegc关于minor Gc的输出信息
此处输入图片的描述

这是Full GC发生后的输出结果示例。
此处输入图片的描述

如果是CMS collector ,那么也可以提供以下CMS信息

由于每次GC事件发生时-verbosegc都会输出日志,很容易看到GC运行引起的堆使用率的变化。

(Java) VisualVM + Visual GC

Java Visual VM是由Oracle JDK提供的GUI分析/监视工具。
此处输入图片的描述
图1:VisualVM截图
你可以从网站上下载最新版,而不是用JDK自带的版本,为了方便起见,JDK自带的Visual vm被称为 Java VisualVM (jvisualvm),而从网站上下载的版本被称为 Visual VM (visualvm). 俩者的功能并不完全相同,有一些细微的差别,就个人而言,我更喜欢Visual VM版本,可以从网站上下载。
在GC运行后,你可以从左侧的窗口选择你想监控的程序。你可以在那里找到“监控”标签。你可以从监控面板中获得关于GC的基本信息
虽然GC的基本状态可以从VisualVM中获得,但是你无法像jstat或者-verbosegc一样获得详细信息

如果你想要jstat提供的详细信息,那么推荐你安装Visual GC的插件

Visual GC可以通过工具菜单实时访问
此处输入图片的描述
图2:Viusal GC安装截图

通过使用Visual GC,您可以更直观地查看运行jstatd所提供的信息。

此处输入图片的描述
图3:Visual GC执行屏幕截图

HPJMeter

HPJMeter便于分析-verbosegc的结果,如果Visual GC被认为是jstat的GUI,那么HPJMeter就是verbosgc的GUI,GC只是HPJMeter功能中的其中之一,HPJMeter是HP开发的性能监控工具。它可以在HP-UX以及Linux和MS Windows中使用。

本来,分析-verbosegc日志图形化的是HPTUN,但是,在HPTun3.0时已经被集成到了HPJMeter中,你不需要单独下载

执行应用程序时,-verbosegc输出结果将被输出到一个单独的文件。

您可以使用HPJMeter打开输出的文件,通过直观的图形用户界面(GUI),可以更快,更轻松地进行GC性能数据分析。

下一篇文章是讲什么的?

在本文中 我重点讲了如何监控GC,为GC调优的准备,根据我的经验 ,我建议使用jstat来监视GC操作,如果你执行GC需要太多时间,那么请尝试使用-verbosegc选项来分析GC,一般的GC调优过程是在基于-verbosegc分析之后进行的

在下一篇文章,我们将讲讲一些具体案例来看到调优GC的最佳选项

# JVM&&GC