当前位置: 首页 > 图灵资讯 > 技术篇> zabbix 监控Java进程 java监控gc

zabbix 监控Java进程 java监控gc

来源:图灵教育
时间:2023-05-18 09:13:26

javaGC监控方法有三种:jstat(命令型),使用visual HPjmeter工具用于vm工具

根据测试要求,建议使用jstat进行粗略的GC性能判断,并决定是否需要进行GC优化。

首先,我们需要知道当前程序使用的垃圾回收机制是什么

命令如下:

java -XX:+PrintCommandLineFlags -version

如果需要GC优化,然后使用visualvm和HPjmeter进行优化,建议使用HPjmeter

jstat

jstat 是HotSpot JVM提供的监控工具。其他监控工具,jps 还有jstatd。有时,您可能需要同时使用三种工具来监控您的应用程序。jstat 不仅提供GC操作信息,还提供类装载操作信息和编译操作信息。本文仅涉及Jstat提供的信息中与GC操作信息监控相关的功能。jstat 被放置在$JDK_HOME/bin。所以只要java 和 javac可以执行,jstat 也可以执行。在命令行环境下,您可以执行以下句子。

$> jstat –gc  $<vmid$> 1000 S0C       S1C       S0U    S1U      EC         EU          OC         OU         PC         PU         YGC     YGCT    FGC      FGCT     GCT3008.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.5883008.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.5883008.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),正如它的名字所描述的,它是虚拟机的ID,Java应用程序在本地和远程机器中都有自己独立的vmid。本地机器上运行的vmid称为lvmid (本地vmid),通常是PID。如果您想获得PID值,您可以使用PS命令或windows任务管理器,但我们建议使用jps,因为PID有时与lvmid不一致。jps 通过Java 随着PS命令显示PIDS和流程名称,jps命令将返回vmids和main方法的信息。首先,通过jps命令找到要监控的java应用的vmid,并将其作为jstat的参数。当几个WAS实例在同一设备上运行时,如果只使用jps命令,只能看到启动(bootstrap)信息。在这种情况下,我们建议使用ps -ef | grep java和jps一起使用。GC性能相关数据需要持续监控,因此在实施jstat时,需要定期输出GC监控信息。例如,“执行”jstat –gc 1000″ (或 GC监控数据将每隔一秒显示一次。”jstat –gc 1000 10″每1秒展示一次,共10次。

参数名称

描述

gc

输出每个堆区的当前可用空间和已用空间(伊甸园、幸存者等)。),GC执行总次数,GC操作累计时间。

gccapactiy

每个堆区输出的最小空间限制(ms)/最大空间限制(mx),GC在每个区域以上执行的次数。(不输出当前使用的空间和GC执行时间)。

gccause

输出-gcutil提供的信息,最后一次执行GC的原因,以及当前执行GC的原因

gcnew

GC性能数据输出新一代空间

gcnewcapacity

统计数据输出新一代空间的大小。

gcold

GC性能数据输出老年空间。

gcoldcapacity

统计数据输出老年空间的大小。

gcpermcapacity

输出持久带空间大小的统计数据。

gcutil

输出各堆区域的使用比例,以及GC执行总次数和GC操作所花费的事件。

你只能关心最常用的命令,你会经常使用它们 -gcutil (或-gccause), -gc and –gccapacity。

· -gcutil 用于检查堆间的使用情况、GC执行次数和GC操作所花费的时间。

· -gccapacity等参数可用于检查实际内存分配的大小。

使用-gc 您可以看到以下输出:

S0C      S1C    …   GCT1248.0   896.0  …   1.2461248.0   896.0  …   1.246…        …      …   …

不同类型的jstat参数输出不同类型的列,如下表所示,根据您使用的内容”jstat option将输出不同列的信息。

说明

Jstat参数

S0C

输出Survivor0空间的大小。单位KB。

-gc

-gccapacity

-gcnew

-gcnewcapacity

S1C

输出Survivor1空间的大小。单位KB。

-gc

-gccapacity

-gcnew

-gcnewcapacity

S0U

已用空间的大小输出Survivor0。单位KB。

-gc

-gcnew

S1U

已使用的空间大小输出Survivor1。单位KB。

-gc

-gcnew

EC

输出Eden空间的大小。单位KB。

-gc

-gccapacity

-gcnew

-gcnewcapacity

EU

已使用的空间大小输出Eden。单位KB。

-gc

-gcnew

OC

输出老年空间的大小。单位KB。

-gc

-gccapacity

-gcold

-gcoldcapacity

OU

输出老年人使用的空间大小。单位KB。

-gc

-gcold

PC

输出持久空间的大小。单位KB。

-gc

-gccapacity

-gcold

-gcoldcapacity

-gcpermcapacity

PU

空间的大小已经用于输出持久代。单位KB。

-gc

-gcold

YGC

GC时间发生在新一代空间中的次数。

-gc

-gccapacity

-gcnew

-gcnewcapacity

-gcold

-gcoldcapacity

-gcpermcapacity

-gcutil

-gccause

YGCT

新一代GC处理需要时间。

-gc

-gcnew

-gcutil

-gccause

FGC

full GC发生的次数。

-gc

-gccapacity

-gcnew

-gcnewcapacity

-gcold

-gcoldcapacity

-gcpermcapacity

-gcutil

-gccause

FGCT

full GC操作需要时间

-gc

-gcold

-gcoldcapacity

-gcpermcapacity

-gcutil

-gccause

GCT

GC操作总时间。

-gc

-gcold

-gcoldcapacity

-gcpermcapacity

-gcutil

-gccause

NGCMN

单位KB是新一代最小空间容量。

-gccapacity

-gcnewcapacity

NGCMX

单位KB是新一代最大的空间容量。

-gccapacity

-gcnewcapacity

NGC

新一代目前的空间容量,单位KB。

-gccapacity

-gcnewcapacity

OGCMN

单位KB是老年人最小的空间容量。

-gccapacity

-gcoldcapacity

OGCMX

单位KB是老年人最大的空间容量。

-gccapacity

-gcoldcapacity

OGC

当前老年人的空间容量系统,单位KB。

-gccapacity

-gcoldcapacity

PGCMN

单位KB是持久代最小空间容量。

-gccapacity

-gcpermcapacity

PGCMX

单位KB是持久代最大的空间容量。

-gccapacity

-gcpermcapacity

PGC

当前持久代的空间容量,单位KB。

-gccapacity

-gcpermcapacity

PC

当前持久代的空间大小,单位KB

-gccapacity

-gcpermcapacity

PU

目前,持久代已经使用了单位KB的空间大小

-gc

-gcold

LGCC

GC最后一次发生的原因

-gccause

GCC

GC目前发生的原因

-gccause

TT

老年阈值。在新生代空存活的次数之前,移动到老年。

-gcnew

MTT

最大的老龄化阈值。在新生代空存活之前,它被移动到老年。

-gcnew

DSS

单位KB是幸存者区所需的空间大小。

-gcnew

jstat 其优点是,它可以继续监控GC操作数据,无论Java应用程序是在本地还是远程运行,只要有控制台就可以使用。当使用时–gcutil 您将输出以下信息。在GC优化时,您需要特别注意YGC, YGCT, FGC, FGCT 和GCT。

S0      S1       E        O        P        YGC    YGCT     FGC    FGCT     GCT0.00    66.44    54.12    10.58    86.63    217    0.928     2     0.067    0.9950.00    66.44    54.12    10.58    86.63    217    0.928     2     0.067    0.9950.00    66.44    54.12    10.58    86.63    217    0.928     2     0.067    0.995

这些信息非常重要,因为它们显示了GC处理需要多长时间。这个例子中,YGC YGCT是217 是0.928,这样在简单计算数据平均数后,你就可以知道新一代GC每次大约需要4ms(0.004秒),而fulll GC平均时间为33ms。然而,仅仅看数据平均数往往无法分析真正的GC问题。这主要是由于GC操作时间的严重偏差(换句话说,如果两次fullll GC的时间是 67ms,所以其中一个fulll GC可能执行10ms,另一个可能执行57ms。)最好使用GC处理时间,以便更好地检测每次GC处理时间 –用verbosegc代替数据平均值。

-verbosegc

-verbosegc JVM参数之一可以在启动Java应用程序时指定。而jstat 即使没有任何参数,也可以监控任何JVM应用程序。 -verbosegc 启动时需要指定,所以你可能会认为没有必要(因为jstat可以替代)。但是, -verbosegc GC的结果会以更简单易懂的方式显示出来,所以对监控GC信息非常有用。

jstat

-verbosegc

监控对象

Java应用程序可以将日志输出到终端,或者使用Jstatd命令通过网络连接远程Java应用程序。

JVM只使用-verbogc作为启动参数。

输出信息

堆状态(已用空间、最大限度、GC执行次数/时间等)

新一代和老年人在GC执行前后的空间大小,GC执行时间。

输出时间

Every designated time

每次设定时间。

每次GC发生。

何时有用。

当你试图观察堆空间的变化时

当你试图了解单个GC的效果时。

下面是-verbosegc 的可用参数· -XX:+PrintGCDetails· -XX:+PrintGCTimeStamps· -XX:+PrintHeapAtGC· -XX:+PrintGCDateStamps (from JDK 6 update 4)

假如只是用了 -verbosegc 。那么默认情况就会增加 -XX:+PrintGCDetails。 –verbosgc 附加参数不是独立的。而是经常组合使用。使用 –在verbosegc之后,每次GC发生时,您都会看到以下格式的结果。

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

收集器

minor GC使用的收集器的名称。

starting occupancy1

GC执行前新一代空间的大小。

ending occupancy1

GC执行后的新一代空间大小。

pause time1

因为执行minor GC,Java应用暂停时间。

starting occupancy3cy3

GC执行前堆区域的总大小

ending occupancy3cy3

GC执行后堆区域的总大小

pause time3

由于执行堆空间GC,Java应用(包括majorora) GC)而停止的时间。

这是-verbosegc 输出minor GC的例子。

S0    S1     E      O      P        YGC    YGCT    FGC    FGCT     GCT0.00  66.44  54.12  10.58  86.63    217    0.928     2    0.067    0.9950.00  66.44  54.12  10.58  86.63    217    0.928     2    0.067    0.9950.00  66.44  54.12  10.58  86.63    217    0.928     2    0.067    0.995

这是 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 collector,因此,以下CMS信息也将被输出。因为 –verbosegc 每次GC事件发生时,参数都会输出日志,我们可以很容易地观察到GC操作对堆空间的影响。

(Java) VisualVM + Visual GC

Java Visual Oraclelelevm由Oraclelevm制成 JDK提供的图形化总结和监控工具。

图1: VisualVM 截图

除了JDK自带的版本,还可以直接从官网下载Visual VM。为了方便起见,JDK中包含的版本被命名为Java VisualVM (jvisualvm),官网提供的版本被命名为Visual VM (visualvm)。两者的功能基本相同,只有一些细微的差异,比如安装组件。就个人而言,我更喜欢可以从官网下载的Visual VM。

图 2: Viusal GC 安装截图

通过Visual GC,您可以更直观地看到执行jstatd 获得的信息。

图3: Visual GC 执行截图

HPJMeter

HPJMeter可以很容易地分析 -verbosegc 如果Visual输出结果 GC可视为jstat的图形版本,因此HPJMeter相当于 –verbosgc的图形版本。当然,GC分析只是HPJMeter提供的众多功能之一。HPJMeter是惠普开发的性能监控工具,可以支持HP-UX,Linux和MS Windows。起初,一个成了HPTune 设计用于图形分析-verbosegc.输出结果。然而,HPTune的功能被集成到HPJMeter中 3.0版本之后,就不需要单独下载HPTune了。但是在运行应用程序时, -verbosegc 结果将输出到一个独立的文件中。您可以直接用HPJMeter打开此文件,以便更直观地分析GC性能数据。

1.下载HPjmeter工具,启动

HPJmeter本身就是jar包,可以通过java命令直接启动,就像运行其他jar包形式的java程序一样

HPjmeter启动命令:Java -Xms512M -Xmx1024M -Xss8M -jar%HPJMETER_PATH%\HPjmeter.jar

2、生成GC的应用服务器 log设置方法 <建议:GC日志最好在1到2天内获得>

GC日志记录了内存的使用和回收状态。当内存故障发生时,可作为分析和调查的手段。

设置-verbose:gc -Xloggc:/home/weblogic/bea/gc.vgc打印gc日志(HPJmeter直接识别vgc格式日志,每次weblogic重启服务,最后一个gc log覆盖)

GC监控方法:增加java启动参数-verbose:gc

将GC日志输出到文件中:不同JDK设置的参数不同,参考JDK官方文档SUNNN:-Xloggc:filename(例如:-Xloggc:/home/weblogic/bea/gc.vgc)IBM:-Xverbosegc:file=filename或-Xverbosegclog:filenameHP:-Xverbosegc=filename

Java启动参数的设置方式有很多,如下所示

Tomcat:在catalina.bat的“set JAVA_OPTS=%JAVA_OPTS% ”后设置

WebLogic:startweblogic.“%cmd”JAVA_HOME%\bin\java %JAVA_VM% %MEM_ARGS% %JAVA_OPTIONS% ”后设置

WebSphere:应用服务器进入管理控制台->进程定义->Java虚拟机高级定义

3.用HPjmeter打开GC日志进行分析

图4: HPJMeter

本文是转载内容,我们尊重原作者对文章的权利。如有内容错误或侵权行为,请联系我们更正或删除文章。