美文网首页
如何监视Java垃圾回收

如何监视Java垃圾回收

作者: 必成_d2f5 | 来源:发表于2020-01-22 16:29 被阅读0次

    在文章《理解Java垃圾收集》中,我们了解了不同GC算法的流程,GC的工作方式,年轻代和年老代,以及您应该了解的新JDK 7中5种类型的GC的知识。这些类型的GC对性能都有影响。

    本文将讨论和说明如何监控Java GC.

    什么是GC监控? 

    GC监控是指通过工具或指令了解JVM运行GC的过程和相关信息。例如,我们可以找出:

    年轻代的对象晋升多少到老年代,或STW发生了多长时间等信息

    通过GC监控,我们可以知道JVM是否有效地运行了GC,是否需要GC调优,同时为GC调优提供依据。

    如何监控GC?

    监视GC的方式不同,但唯一的区别是如何显示GC操作信息。GC由JVM完成,并且由于GC监视工具会公开JVM提供的GC信息,所以无论您如何监视GC,您都将获得相同的结果。因此,您不需要学习所有方法来监视GC,但是由于只需要很少的时间就可以学习每种GC监视方法,因此了解其中的几种方法可以帮助您在不同的情况和环境下使用正确的方法。

    首先,取决于访问接口,可以将GC监视方法分为CUIGUI。典型的CUI GC监视方法涉及使用单独的名为“ jstat ”的CUI应用程序,或者在运行JVM时选择一个名为“ verbosegc ” 的JVM选项。

    GUI GC监视是通过使用单独的GUI应用程序完成的,三个最常用的应用程序是“ jconsole”,“ jvisualvm”和“ Visual GC”。

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

    jstat

    jstat是HotSpot JVM中的监视工具。用于HotSpot JVM的其他监视工具是jpsjstatd。有时,您需要使用所有三个工具来监视Java应用程序。

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

    jstat位于$ JDK_HOME / bin中,因此,如果javajavac可以在不从命令行设置单独目录的情况下运行,那么jstat也可以。

    您可以尝试在命令行中运行以下命令。

    $> jstat –gc  $<vmid$> 1000

    S0C       S1C       S0U    S1U      EC         EU          OC         OU         PC         PU         YGC     YGCT    FGC      FGCT     GCT

    3008.0   3072.0    0.0     1511.1   343360.0   46383.0     699072.0   283690.2   75392.0    41064.3    2540    18.454    4      1.133    19.588

    3008.0   3072.0    0.0     1511.1   343360.0   47530.9     699072.0   283690.2   75392.0    41064.3    2540    18.454    4      1.133    19.588

    3008.0   3072.0    0.0     1511.1   343360.0   47793.0     699072.0   283690.2   75392.0    41064.3    2540    18.454    4      1.133    19.588

    $>

    就像在示例中一样,实型数据将与以下列一起输出:

    S0C S1C S0U S1U EC EU OC OU PC

    顾名思义,vmid(虚拟机ID)是VM 的ID。可以使用vmid指定在本地计算机或远程计算机上运行的Java应用程序。在本地计算机上运行的Java应用程序的vmid称为lvmid(本地vmid),通常是PID。要找出lvmid,可以使用ps命令或Windows任务管理器写入PID值,但是我们建议使用jps,因为PID和lvmid并不总是匹配。jps代表Java PS。jps显示vmids和主要方法信息。就像ps显示PID和进程名称一样。

    通过使用jps查找要监视的Java应用程序的vmid,然后将其用作jstat中的参数。我们建议您使用ps -ef | grep java命令以及jps

    GC性能数据需要不断观察,因此在运行jstat时,请尝试定期输出GC监视信息。 

    例如,运行“ jstat –gc <vmid> 1000 ”(或1s)将每1秒在控制台上显示一次GC监视数据。“ jstat –gc <vmid> 1000 10 ”将每1秒显示一次GC监视信息,共10次。

    除了-gc以外,还有许多其他选项,其中列出了与GC相关的选项。

    选项名称描述

    gc 显示每个堆区域的当前大小及其当前使用情况(Eden,Survivor,年老代等),执行的GC总数以及GC操作的累积时间。

    gccapactiy 显示每个堆区域的最小大小(ms)和最大大小(mx),当前大小以及每个区域执行的GC数量。(不显示GC操作的当前使用情况和累积时间。)

    gccause 显示了“ -gcutil提供的信息” +上一个GC的原因以及当前GC的原因。

    gcnew 显示年轻代的GC性能数据。

    gcnewcapacity 显示年轻代大小的统计信息。

    gcold 显示年老代的GC性能数据。

    gcoldcapacity 显示年老代大小的统计信息。

    gcpermcapacity 显示永久代的统计信息。

    gcutil 以百分比显示每个堆区域的使用情况。还显示执行的GC总数和GC操作的累积时间。

    仅查看频率,您可能会最多依次使用-gcutil(或-gccause),- gc-gccapacity

    -gcutil用于检查堆区域的使用情况,执行的GC数量以及GC操作的总累积时间,

    -gccapacity等其他选项可用来检查大小。

    您可以使用-gc选项查看以下输出:

    S0C      S1C    …   GCT

    1248.0   896.0  …   1.246

    1248.0   896.0  …   1.246

    …        …      …   …

    不同的jstat选项显示不同类型的列,如下所示。当您使用右侧列出的“ jstat选项”时,将显示每列信息。

    常用描述分析


    S0C 以KB为单位显示Survivor0区域的当前大小


    S1C 以KB为单位显示Survivor1区域的当前大小


    S0U 以KB为单位显示Survivor0区域的当前使用情况


    S1U 以KB为单位显示Survivor1区域的当前使用情况


    EC 以KB为单位的Eden区的当前大小


    EU 显示Eden区的当前使用情况,以KB为单位


    OC 显示年老代的当前大小,以KB为单位


    OU 以KB显示年老代的当前使用情况


    YGC  Youngl GC事件的次数


    YGCT Young GC的累计总时间


    FGC  Full GC事件的次数


    FGCT Full GC的累计总时间


    GCT GC操作的总累积时间


    jstat的优点是只要可以使用控制台,它就可以始终监视在本地/远程计算机上运行的Java应用程序的GC操作数据。使用–gcutil时,输出结果如下。在进行 GC调优时,请特别注意YGC,YGCT,FGC,FGCT和GCT这几个指标。


    S0      S1       E        O        P        YGC    YGCT     FGC    FGCT     GCT


    0.00    66.44    54.12    10.58    86.63    217    0.928     2     0.067    0.995


    0.00    66.44    54.12    10.58    86.63    217    0.928     2     0.067    0.995


    0.00    66.44    54.12    10.58    86.63    217    0.928     2     0.067    0.995


    这些项目很重要,因为它们显示了运行GC所花费的时间。

    在此示例中,YGC为217,YGCT为0.928。因此,在计算算术平均值之后,您可以看到每次YGC 大约需要4毫秒(0.004秒)。同样,平均Full GC时间为33ms。但是算术平均值通常无助于分析实际的GC问题。为了查看单次GC时间而不是算术平均时间,更好的方式是使用 -verbosegc

    -verbosegc

    -verbosegc是运行Java应用程序时指定的JVM选项之一。java程序启动时指定-verbosegc,每次出现GC时都会显示易于理解的输出结果,因此对于监视GC信息非常有帮助。可在日志中输出堆状态信息(使用情况,最大大小,GC /时间的次数等),GC之前/之后的年轻代和年老代的大小,以及GC耗时

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

    -XX:+ PrintGC详细信息

    -XX:+ PrintGCTimeStamps

    -XX:+ PrintHeapAtGC 

    -XX:+ PrintGCDateStamps

    如果仅使用-verbosegc,则默认情况下将应用-XX:+ PrintGCDetails

    –verbosgc的其他选项不是唯一的,可以混合使用。

    使用-verbosegc时,每当出现Young GC时,您都可以按照以下格式查看结果。

    [GC [<collector>: <starting occupancy1> -> <ending occupancy1>, <pause time1> secs] <starting occupancy3> -> <ending occupancy3>, <pause time3> secs]

    这是发生Full GC后输出结果的示例。

    [Full GC [Tenured: 3485K->4095K(4096K), 0.1745373 secs] 61244K->7418K(63104K), [Perm : 10756K->10756K(12288K)], 0.1762129 secs] [Times: user=0.19 sys=0.00, real=0.19 secs]

    如果使用CMS收集器,则还可以提供CMS信息。

    由于-verbosegc选项每次发生GC事件时都会输出一条日志,因此很容易看到由GC操作引起的堆使用率的变化。

    (Java)VisualVM 

    Java Visual VM是Oracle JDK提供的GUI分析/监视工具。

    图1:VisualVM屏幕截图。

    可以从Visual Studio的网站直接下载Visual VM,而不是JDK附带的版本。为了方便起见,JDK附带的版本将称为Java VisualVM(jvisualvm),而网站上提供的版本将称为Visual VM(visualvm)。两者的功能并不完全相同,因为它们之间存在细微差别,例如在安装插件时。就个人而言,我更喜欢Visual VM版本,可以从网站上下载。

    运行Visual VM后,如果从左侧窗口中选择要监视的应用程序,则可以在其中找到“ 监视 ”选项卡。您可以从此“监视”选项卡获取有关GC和堆的基本信息。 

    如果需要jstat提供的详细信息,则建议安装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输出结果将重定向到单独的文件。

    您可以使用HPJMeter打开重定向的文件,这可以通过直观的GUI更快,更轻松地分析GC性能数据。

    图4:HPJMeter。

    相关文章

      网友评论

          本文标题:如何监视Java垃圾回收

          本文链接:https://www.haomeiwen.com/subject/unouzctx.html