成为Java GC专家 第二篇(译)
如何监控Java垃圾回收(译)
这是”成为Java GC专家”系列的第2篇,
在第一篇文章中了解Java GC我们学习了各种GC算法,关于Gc如何工作,年轻代和老年代是什么,在新的JDK7中,你应该知道5种GC类型,和这些GC类型对应的性能影响
在本文中,我将解释JVM如何实时运行GC
什么是GC监控
垃圾回收监控是搞清楚JVM如何运行GC的过程,比如,我们可以发现:
- 当一个年轻代的对象移动到老年代
- 或者是‘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的其他监控工具分别为jps和jstatd,有时 你需要所有三种工具监控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顺序使用
显示不同的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)的时间
如果是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所提供的信息。
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的最佳选项