性能测试过程中,我们该如何监控java虚拟机内存的使用情况,用以判断JVM是否存在内存问题呢?如何判断JVM垃圾回收是否正常?一般的top指令基本上满足不了这样的需求,因为它主要监控的是总体的系统资源,很难定位到java应用程序。
在项目实践过程中,我们探索和使用了一款新工具--Jstat。
先秀一下。Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。
那,该怎么用呢?
语法结构如下:jstat [Options] vmid [interval] [count]
Options — 选项,我们一般使用 -gcutil 查看gc情况
vmid — VM的进程号,即当前运行的java进程号
interval– 间隔时间,单位为秒或者毫秒
count — 打印次数,如果缺省则打印无数次
下面给出一个实际的例子:
注:由于JVM内存设置较大,图中百分比变化不太明显
图中参数含义如下:
S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
上图的示例,红框中,我们可以看到,5次young gc之后,垃圾内存被从Eden space区(E)放入了Old space区(O),并引起了百分比的变化,导致Survivor space使用的百分比从19.69%(S0)降到10.34%(S1)。有效释放了内存空间。绿框中,我们可以看到,一次full gc之后,Old space区(O)的内存被回收,从36.81%降到35.01%。
图中同时打印了young gc和full gc的总次数、总耗时。而,每次young gc消耗的时间,可以用相间隔的两行YGCT相减得到。每次full gc消耗的时间,可以用相隔的两行FGCT相减得到。例如红框中表示的第一行、第二行之间发生了1次young gc,消耗的时间为52.281-52.252=0.029秒。
常驻内存区(P)的使用率,始终停留在37.6%左右,说明常驻内存没有突变,比较正常。
如果young gc和full gc能够正常发生,而且都能有效回收内存,常驻内存区变化不明显,则说明java内存释放情况正常,垃圾回收及时,java内存泄露的几率就会大大降低。但也不能说明一定没有内存泄露。
以上,介绍了Jstat按百分比查看gc情况的功能。其实,它还有其它功能,例如加载类信息统计功能、内存池信息统计功能等,那些是以绝对值的形式打印出来的,比较少用,在此就不做介绍。
为了更全面的监控JVM内存使用情况,我们需要引入更强大的工具来进一步分析–JConsole。敬请关注。
--------
一、概述
SUN 的JDK中的几个工具,非常好用。秉承着有免费,不用商用的原则。以下简单介绍一下这几种工具。(注:本文章下的所有工具都存在JDK5.0以上版本的工具集里,同javac一样,不须特意安装) 。
我一共找到以下四个工具:重点看看jconsole和jmap。
Java代码 复制代码
jps
:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。
jstat
:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。
jmap
:打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。
jconsole
:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。
二、 使用介绍:
1、jstat :我想很多人都是用过unix系统里的ps命令,这个命令主要是用来显示当前系统的进程情况,有哪些进程,及其 id。 jps 也是一样,它的作用是显示当前系统的java进程情况,及其id号。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),和他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。
使用方法:在当前命令行下打 jps(需要JAVA_HOME,没有的话,到改程序的目录下打) 。
可惜没有linux下的ps好用,名称不好用。但是在第四个工具jconsole的界面里面会有具体JAR包的名称。
2、jstat :对VM内存使用量进行监控。
jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。以下详细介绍各个参数的意义。
jstat -class pid:显示加载class的数量,及所占空间等信息。
jstat -compiler pid:显示VM实时编译的数量等信息。
jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。
jstat -gcnew pid:new对象的信息。
jstat -gcnewcapacity pid:new对象的信息及其占用量。
jstat -gcold pid:old对象的信息。
jstat -gcoldcapacity pid:old对象的信息及其占用量。
jstat -gcpermcapacity pid: perm对象的信息及其占用量。
jstat -util pid:统计gc信息统计。
jstat -printcompilation pid:当前VM执行的信息。
除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。
3、jmap 是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如果连用 SHELL jmap -histo pid>a.log可以将其保存到文本中去(windows下也可以使用),在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。 jmap -dump:format=b,file=f1 3024可以将3024进程的内存heap输出出来到f1文件里。
4、jconsole 是一个用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。由于是GUI程序,这里就不详细介绍了,不会的地方可以参考SUN的官方文档。
使用方法:命令行里打 jconsole,选则进程就可以了。
友好提示:windows查看进程号,由于任务管理器默认的情况下是不显示进程id号的,所以可以通过如下方法加上。ctrl+alt+del打开任务管理器,选择‘进程’选项卡,点‘查看’->''选择列''->加上''PID'',就可以了。当然还有其他很好的选项。
三、参考资料:
- article:http://elf8848.javaeye.com/blog/442806
- jps:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html
- jstat:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html
- jmap:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html
- jconsole:http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html
分享到:
相关推荐
它可以连接到本地或远程的JVM,展示详细的内存、线程、类加载、CPU使用等信息,并提供警报设置。在Tomcat环境中,jconsole可以帮助实时监控Tomcat服务器的资源消耗,识别性能瓶颈。配置jconsole与Tomcat的连接通常...
jstat是Java虚拟机统计监视工具,它是Java开发工具包(JDK)的一部分,用于监控Java虚拟机(JVM)中的性能统计信息。该工具可以用来显示垃圾收集(GC)统计信息以及其他与JVM相关的性能指标。由于jstat工具不受...
为了获取这些信息,我们可以使用jstack工具,它是Java开发工具包(JDK)的一部分,能够输出Java进程的线程堆栈跟踪信息。 jstack命令通常可以输出以下类型的信息: 1. 线程的完整堆栈跟踪,包括本地方法。 2. 显示...
10. jstat.exe:JVM统计监控工具,用于监视Java虚拟机中各种运行时组件的行为,例如堆内存使用情况、垃圾回收情况等。 11. jstatd.exe:JVM统计监控守护进程,可以远程监控JVM的性能。 12. kinit.exe、klist.exe、...
下面通过一个实例来说明如何使用`jstack`来找出某个Java进程中CPU占用最高的线程并定位其堆栈信息: 1. **找出Java进程ID**:假设我们的Java应用名为`mrf-center`,可以通过`ps -ef | grep mrf-center | grep -v ...
它集成了多种原本独立存在的命令行工具,如`jstat`, `JConsole`, `jstack`, `jmap`, 和 `jinfo`,并通过一个统一的图形用户界面(GUI)提供了更加直观的使用体验。 - **核心功能**: - **监视**:监控Java应用程序...
4. `jstat`:这是一个强大的统计工具,用于实时监控JVM的运行时统计信息,如类装载、垃圾收集、内存使用等。`jstat`的选项丰富,可以根据不同需求查询特定的数据,例如`jstat -gc <pid>`可以显示垃圾回收的详细统计...
这部分主要介绍了HP-UX系统上可用的各种Java工具和选项,旨在帮助用户更好地了解和使用这些工具来诊断和监控Java应用的状态。 - **1.1.1 崩溃分析工具**:这些工具用于分析Java应用崩溃时产生的日志文件,帮助...
例如jps、jstat、jmap、jstack和jcmd等命令行工具,以及基于Java Management Extensions(JMX)的图形用户界面工具,如JConsole和VisualVM,这些工具允许开发者和管理员监控虚拟机的性能和资源使用情况,从而进行...
jstat(JVM Statistics Monitoring Tool)是Oracle JDK提供的一款强大的命令行工具,用于实时监控Java虚拟机的各种运行状态,包括内存管理、类加载、垃圾收集以及JIT编译等关键指标。了解并熟练运用jstat,能帮助...
6. **jstat**:JVM统计监测工具,可以收集JVM的各种性能数据,如垃圾收集、内存使用等。 7. **jinfo**:提供配置JVM参数的实时查看和修改功能。 8. **jmap**:用于生成堆转储文件,帮助分析内存泄漏等问题。 9. *...
JVM命令如jps、jmap、jstack、jinfo和jstat等能够提供JVM内部状态和性能数据,帮助工程师进行深入分析。 GC分析,即垃圾收集分析,也是一大关键点。通过分析GC日志,工程师可以了解垃圾回收的行为和影响,对于性能...
可以使用 top 命令、jstat 命令、dump 文件等工具来诊断和解决内存溢出问题。 2. Java 多线程几种状态变更的图?Java 多线程的状态变更包括新建、就绪、运行、阻塞、死亡等几个状态。 3. Java 中的 wait 和 sleep 的...
这涉及到使用JDK自带的工具如`jstat`、`jmap`、`jhat`和`jfr`(Java飞行记录器)等。 4. **垃圾回收**:垃圾回收是Java性能管理的重要方面,指南提供了关于不同垃圾收集器的详细信息,如G1、Shenandoah、ZGC等,...
总之,理解JVM的工作机制,掌握如何正确传递参数,避免大对象使用,处理好内存管理和线程安全,以及熟练运用JVM分析工具,都是Java开发中不可或缺的技能。通过这些实践和案例学习,开发者能够更好地优化代码,提升...
如`jinfo`用于查看或修改JVM配置,`jstat`用于收集JVM的各种统计信息,`jmap`用于生成堆转储文件以供分析,以及`jstack`用于打印线程堆栈跟踪,这些都是诊断和优化Java应用程序的关键工具。 总的来说,"JVM.zip...
10. **JVM内存诊断工具**:JVisualVM、jmap、jstat等工具可以帮助开发者监控和分析Java应用的内存使用情况,找出可能的内存问题。 "文档说明.txt"可能是对这个项目的详细解释,包括代码实现、设计思路和使用说明。...
- **功能**:用于设置Java工具(如JVM)的启动参数。 - **应用场景**:在需要调整JVM默认配置的情况下。 ##### 1.13 jconsole (1.5+ only) - **功能**:一个远程监控Java应用程序的图形化工具。 - **应用场景**:...
3. **监控Tomcat**:`bin/catalina.sh`或`catalina.bat`脚本也可以以“监控”模式运行,通过`jps`命令可以查看Tomcat进程,而`jstat`和`jconsole`等JVM工具可以分析Tomcat的内存使用、线程状态和GC行为。 4. **配置...