javaGC监控方法有三种:jstat(命令型),使用visual HPjmeter工具用于vm工具
根据测试要求,建议使用jstat进行粗略的GC性能判断,并决定是否需要进行GC优化。
首先,我们需要知道当前程序使用的垃圾回收机制是什么
命令如下:
java -XX:+PrintCommandLineFlags -version
如果需要GC优化,然后使用visualvm和HPjmeter进行优化,建议使用HPjmeter
jstatjstat 是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 GCJava 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 执行截图
HPJMeterHPJMeter可以很容易地分析 -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
本文是转载内容,我们尊重原作者对文章的权利。如有内容错误或侵权行为,请联系我们更正或删除文章。