`
crazier9527
  • 浏览: 1013664 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用Jstat监控gc情况(收藏)

 
阅读更多

性能测试过程中,我们该如何监控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代码 复制代码
  1. jps   
  2. :与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。   
  3.   
  4. jstat   
  5. :一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。   
  6.   
  7. jmap   
  8. :打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。   
  9.   
  10. jconsole   
  11. :一个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 

分享到:
评论

相关推荐

    java jstat 查看哪个进程频繁GC垃圾回收

    这些参数将使JVM在每次垃圾回收时打印详细的日志,包括GC的类型(如Young GC或Full GC)、执行时间、回收前后的内存使用情况等。通过对这些日志的分析,我们可以识别出哪些操作导致了频繁的垃圾回收,如大对象分配、...

    JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解.docx

    jstat 主要用来监控 JVM 的垃圾回收和内存使用情况。语法格式如下:jstat [options] [vmid]。指令行参数选项解释如下: * -class monitoring class loader * -gc monitoring garbage collector * -gccapacity ...

    JVM内存—jstat分析

    通过合理利用`jstat`的不同选项,可以实现对JVM内存使用情况的全面监控,并据此采取相应的优化措施,从而提高应用程序的整体性能和稳定性。希望本文能够为读者在实际工作中使用`jstat`提供有价值的参考。

    jmap jstat等命令介绍

    在监控Tomcat时,`jstat -gc <pid>`能提供GC活动的详细数据,包括新生代、老年代的内存使用情况,以及GC的时间和频率,这有助于调整GC策略以优化性能。例如,如果发现频繁的Minor GC导致了应用暂停时间过长,可能...

    jstat命令手册.pdf

    在实际应用中,jstat可以用于连续监视JVM的状态,例如,通过指定`interval`和`count`参数来监控GC活动或者类加载情况。命令中的`vmid`参数通常由本地JVM进程的标识符构成,格式可以是`[protocol:][//]lvmid[@...

    jstat官方介绍

    jstat是Java虚拟机统计监视工具,它是Java开发工具包(JDK)的一部分,用于监控Java虚拟机(JVM)中的性能统计信息。该工具可以用来显示垃圾收集(GC)统计信息以及其他与JVM相关的性能指标。由于jstat工具不受...

    jstat-1压缩包1111

    - `-gc`:显示垃圾收集统计信息,包括新生代、老年代的内存使用情况,以及垃圾收集的时间和次数。 - `-gccapacity`:显示各个区域的总容量和剩余容量。 - `-gccause`:与-gc选项相似,但会显示导致垃圾收集的原因。 ...

    【转】Java内存泄露_JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat

    其次,`jconsole`是一个图形化的JVM监视工具,它可以提供内存使用情况、线程信息、类加载情况等实时数据。开发者可以通过jconsole连接到本地或远程的Java进程,直观地看到各种性能指标,并进行诊断。此外,jconsole...

    java诊断与调优常用命令jmap、jstack、jstat使用实战.pdf

    例如,`jstat -gc pid [interval] [count]` 可以监控新老生代的内存使用和垃圾回收频率。使用`jstat -gcuitl pid [interval] [count]` 可以看到内存使用率的百分比,帮助监控内存分配和回收效率。 掌握这些命令行...

    java问题快速定位

    ### 使用jstat监控Java应用程序 `jstat`是Java自带的一个轻量级命令行工具,它可以通过JVM内置的指令来监控Java应用程序的资源和性能情况,特别适用于实时监控Heap大小和垃圾回收的状态等。 - **基本用法**: - `...

    JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!.docx

    我们可以使用 jstat -gc pid 1000 命令来观察 GC 分代变化情况。如果看到 GC 比较频繁,我们可以进一步分析 GC 的问题。 三、磁盘故障排查 磁盘故障排查是 Java 线上故障排查的第三步骤。我们可以使用 df -hl 命令...

    java监控系统链接和内存使用情况

    Java监控系统对于理解应用程序的运行状况...总的来说,理解和监控Java系统的链接和内存使用情况,是确保系统高效、稳定运行的重要一环。开发者应熟练掌握相关工具和技巧,持续关注系统的健康状况,及时进行优化和调整。

    jvm内存监控工具使用

    通过合理利用 VisualVM 及其集成的命令行工具,开发者能够有效地监控和分析 JVM 的内存使用情况,及时发现并解决内存泄漏、GC 效率低下等问题。掌握这些工具的使用方法,对于任何 Java 开发者而言都是必备技能。

    JVM Full GC 之 MAT工具分析实践-阿沐1

    例如,使用`jstat -gc pid`可以监控老年代的大小,预测何时可能发生Full GC。 MAT工具的分析功能强大,它能解析heap dump文件,提供Histogram、Dominator Tree等视图。Histogram显示了内存中对象的分布,帮助我们...

    JVM监控工具介绍.docx

    `jmap` 提供了查看堆内存使用情况的功能,可以打印堆的详细信息,如各个区域的容量和使用情况,以及对象直方图。此外,`jmap -histo` 可以用来查看哪些类占用内存最多,这对于查找内存泄漏很有帮助。 5. **jstatd*...

    Java性能监控工具

    通过`jstat -gc`参数,我们可以获取关于GC的详细信息,包括年轻代和老年代的内存使用情况。 `jmap`是另一个强大的工具,它可以打印出Java进程的内存映射或者生成堆内存转储文件。`-heap`选项可以查看堆内存的详细...

    JVM监控工具介绍

    - 监控GC活动 (`-gc`)。 - 显示不同区域的heap容量 (`-gccapacity`)。 - 显示导致GC的原因 (`-gccause`)。 **命令格式:** ``` jstat [options] ``` **示例:** ``` jstat -gc 2083 ``` #### jconsole **概述:...

    Java程序员必须了解的GC工作原理

    例如,`jstat`可以实时监控GC的状态,而`jhat`可以分析堆转储文件,找出内存泄漏的线索。 在实际开发中,Java程序员可以通过调整JVM参数来控制GC的行为,比如设置堆大小、选择GC算法、设置新生代和老年代的比例等。...

    实战Hot Spot JVM GC

    jstat命令提供了一个强大的工具用于监控Java虚拟机中的堆使用情况和GC的状态。使用例如"-gccapacity"、"-gccause"、"-gcutil"等参数可以获取不同维度的详细信息。 优化GC策略通常包括调整JVM启动参数,如-server...

    JVM内存模型和性能调优:JVM调优工具详解及调优实战:jstat – 第38篇

    通过`jstat -gc pid [interval] [count]`,我们可以定期获取这些数据,以监控JVM的内存使用情况和GC压力,从而识别可能存在的性能问题。 三、JVM内存模型与性能调优 JVM内存模型的调优主要包括调整堆内存大小、...

Global site tag (gtag.js) - Google Analytics