在文章《理解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监视方法分为CUI和GUI。典型的CUI GC监视方法涉及使用单独的名为“ jstat ”的CUI应用程序,或者在运行JVM时选择一个名为“ verbosegc ” 的JVM选项。

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

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

jstat

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

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

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

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

$> jstat –gc  $ 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 1000 ”(或1s)将每1秒在控制台上显示一次GC监视数据。“ jstat –gc 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 [: -> , secs] -> , 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可方便地分析-verbosegc输出结果。如果可以将Visual GC视为jstat的GUI等效项,则HPJMeter将成为-verbosgc的GUI等效项。当然,GC分析只是HPJMeter提供的众多功能之一。HPJMeter是HP开发的性能监视工具。它可以在HP-UX以及Linux和MS Windows中使用。

执行应用程序时,-verbosegc输出结果将重定向到单独的文件。

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

图4:HPJMeter。

java代码获取gc信息,如何监视Java垃圾回收相关推荐

  1. java 获取apk版本号_纯JAVA环境获取APK信息:包名,版本,版本号,大小,权限...

    [实例简介] 纯JAVA环境获取APK信息:包名,版本,版本号,大小,权限... 代码讲解地址:http://blog.csdn.net/chillax_li/article/details/4185 ...

  2. java 读取流的字符编码格式_如何使用Java代码获取文件、文件流或字符串的编码方式...

    标签: 今天通过网络资源研究了一下如何使用Java代码获取文件.文件流或字符串的编码方式,现将代码与大家分享: package com.ghj.packageoftool; import info.m ...

  3. 如何使用java代码获取屏幕显示器个数

    使用java代码获取屏幕显示器个数,主要是使用java中的GraphicsEnvironment对象,关于GraphicsEnvironment对象的介绍,可以去GraphicsEnvironment ...

  4. java获取jndi密码_用JAVA代码获取Weblogic配置的JNDI 数据源连接

    第一步:生成与JDK版本对应的weblogicjar,利用cmd 进入到weblogic_home 路径下进入到server/lib目录,然后运行  JDK  1.6 命令 "java -j ...

  5. java 获取远程服务器信息,java 远程获取服务器信息

    java 远程获取服务器信息 内容精选 换一换 已成功登录Java性能分析.待安装Guardian的服务器已开启sshd.待安装Guardian的服务器已安装JRE,JRE版本要求为Huawei JD ...

  6. java代码获取银行实时汇率

    java代码获取银行实时汇率 因为工作的时候甲方要求实施获取银行汇率,并且他们还不提供免费的接口,我就自己去网上找了接口,并写了实现代码,如果你需要的话直接复制粘贴就可以用了. 我用的是idea开发的 ...

  7. Java毕设项目诊所信息管理系统(java+VUE+Mybatis+Maven+Mysql)

    Java毕设项目诊所信息管理系统(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Web ...

  8. Java自己文章只能自己修改_文章目录Java代码俯身指南,主要为Java开发人员提供代码复审参考,快捷有效提出修改意见。目的发现代码错误:一个人写的代码可能会有一些思想和设计盲点,多个人尽...

    文章目录 Java代码俯身指南,主要为Java开发人员提供代码复审参考,快捷有效提出修改意见. 目的发现代码错误:一个人写的代码可能会有一些思想和设计盲点,多个人尽早的发现BUG. 统一代码风格:统一 ...

  9. Android 使用代码获取签名信息

    在使用百度地图,微信分享等等第三方SDK的时候,都需要在对应的网站上注册应用信息,其中之一就是通过包名和签名生成一个MD5或者SHA1编码的字符串. 通常情况下,这些信息可以通过ADT工具或者keyt ...

最新文章

  1. 怎么用Windows 2008配置DHCP中继?
  2. python爬取京东商品图片_python利用urllib实现爬取京东网站商品图片的爬虫实例
  3. python类的方法三种访问权_Python基础33-面向对象(继承资源(属性与方法)的使用注意)...
  4. 无源的nfc加传感_基于ON Semiconductor SPS无源温度标签,应用于冷链运输的 UHF 标签读取器方案...
  5. 影响个人计算机系统功能的因素,影响个人计算机系统功能的因素除了系统使用哪种位的微处理器外,还有CPU的时钟频率、CPU主内存容量、CPU所能提供的指令集。...
  6. PHP 显示信息到控制台console
  7. mysql close conn_mysql CloseConnection问题
  8. 整理几个有想法的面试题
  9. 复合火焰探测传感器_智能消防水炮能够自动跟踪火焰吗?
  10. 道路矢量数据下载教程
  11. 计算机组成原理(LogisimVerilog部分)-笔记
  12. 关于vs编译器的一些认识
  13. Altium Designer使用-----快速覆铜脚本的使用
  14. 在 Windows 10 中映射网络驱动器
  15. 马万经:城市道路交通主动协同管控
  16. python安装pygame教程_pygame 安装教程
  17. MoveIt! RViz Visual Tools设置
  18. 《计算之魂》思考题4.4
  19. 十六进制转换成八进制(超级详细注释了)
  20. saber与matlab,MATLAB与SABER联合仿真(Co-sim)遇到的问题

热门文章

  1. 企业管理器控制台本地无法访问
  2. 如何启用×××服务器端的IPsec功能
  3. Oracle中的AWR,全称为Automatic Workload Repository
  4. ubuntu shell脚本出错 dash
  5. SpringMVC使用ModelAndView进行重定向
  6. 通用easyui查询页面组件
  7. hdu1284钱币兑换问题
  8. Java如何简单实现一个定时器
  9. 软件测试流程和项目管理流程
  10. linux 快组描述符,Linux 进程描述符 task struct