zoukankan      html  css  js  c++  java
  • jvm指令调试

    监控GC的工具分为2种:命令行工具和图形工具

    常用的命令行工具有:

    注:下面的命令都在JAVA_HOME/bin中,是java自带的命令。如果您发现无法使用,请直接进入Java安装目录调用或者先设置Java的环境变量,一个简单的办法为:直接运行命令 export PATH=$JAVA_HOME/bin:$PATH;

    另外,一般的,在Linux下,下面的命令需要sudo权限,在windows下,部分命令的部分选项不能使用。

    Java系列笔记(4) - JVM监控与调优

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

    Java虚拟机学习 - JDK可视化监控工具

     

    1、jps

    查询正在运行的JVM进程,常用的参数为:

        -q:只输出LVMID,省略主类的名称

        -m:输出虚拟机进程启动时传给主类main()函数的参数

        -l:输出主类的全类名,如果进程执行的是Jar包,输出Jar路径

        -v:输出虚拟机进程启动时JVM参数

    命令格式:jps [option] [hostid] 

    一个简单的例子:


     

    在上图中,有一个vid为309的apache进程在提供web服务。

    图形化界面JConsole启动后,将自动搜索本机运行的jvm进程,不需要jps命令来查询指定

    2、jstat

    jstat可以实时显示本地或远程JVM进程中类装载、内存、垃圾收集、JIT编译等数据(如果要显示远程JVM信息,需要远程主机开启RMI支持)。

    如果在服务启动时没有指定启动参数-verbose:gc,则可以用jstat实时查看gc情况。

    命令格式:jstat [option vmid [interval[s|ms] [count]]]

    参数解释:
    Options — 选项,我们一般使用 -gcutil 查看gc情况
    vmid    — VM的进程号,即当前运行的java进程号
    interval– 间隔时间,单位为秒或者毫秒
    count   — 打印次数,如果缺省则打印无数次

    -gcutil: 监视内容与-gc基本相同,不同的是这里显示的是已占用的百分比,如S0为86.53,代表着S0区已使用了86.53%

    >jstat -gc 1532

    >jstat -gc 1532 1000 5

    >jstat -gcutil 1532 1000 5

    jstat有如下选项:

       -class:

    监视类装载、卸载数量、总空间及类装载所耗费的时间

       -gc:

    监听Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量,以用空间、GC时间合计等信息

       -gccapacity:

    监视内容与-gc基本相同,但输出主要关注java堆各个区域使用到的最大和最小空间

       -gcutil:

    监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比

       -gccause:

    与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因

       -gcnew:

    监视新生代GC状况

       -gcnewcapacity:

    监视内同与-gcnew基本相同,输出主要关注使用到的最大和最小空间

       -gcold:

    监视老年代GC情况

       -gcoldcapacity:

    监视内同与-gcold基本相同,输出主要关注使用到的最大和最小空间

       -gcpermcapacity:

    输出永久代使用到最大和最小空间

       -compiler:

    输出JIT编译器编译过的方法、耗时等信息

       -printcompilation:

    输出已经被JIT编译的方法


    一些术语的中文解释:

    S0C:S0区容量(S1区相同,略)

    S0U:S0区已使用

    EC:E区容量

    EU:E区已使用

    OC:老年代容量

    OU:老年代已使用

    PC:Perm容量

    PU:Perm区已使用

    YGC:Young GC(Minor GC)次数

    YGCT:Young GC总耗时

    FGC:Full GC次数

    FGCT:Full GC总耗时

    GCT:GC总耗时

    实例使用
    [root@localhost bin]# jstat -gcutil 25444

      S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
     11.63   0.00   56.46  66.92  98.49 162    0.248    6      0.331    0.579

    实例使用2:(25444是java的进程号,ps -ef | grep java)

    [root@localhost bin]# jstat -gcutil 25444 1000 5

      S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
     73.54   0.00  99.04  67.52  98.49    166    0.252     6    0.331    0.583
     73.54   0.00  99.04  67.52  98.49    166    0.252     6    0.331    0.583
     73.54   0.00  99.04  67.52  98.49    166    0.252     6    0.331    0.583
     73.54   0.00  99.04  67.52  98.49    166    0.252     6    0.331    0.583
     73.54   0.00  99.04  67.52  98.49    166    0.252     6    0.331    0.583       
          
                
    ps -ef|grep jboss      
    jstat -gcutil $pid

      S0         S1     E         O       P       YGC     YGCT    FGC    FGCT     GCT   
     74.79       0.00   95.15       0.86      37.35      2      0.112    0     0.000   0.112      
          
        

    3、jstack

    用于生成当前JVM的所有线程快照,线程快照是虚拟机每一条线程正在执行的方法,目的是定位线程出现长时间停顿的原因

       -F:当正常输出的请求不被响应时,强制输出线程堆栈

       -l:除堆栈外,显示关于锁的附加信息

       -m:如果调用到本地方法的话,可以显示C/C++的堆栈

    命令格式:jstack [option] vmid

    4、jmap

    jmap用来查看堆内存使用状况,一般结合jhat使用

    用于显示当前Java堆和永久代的详细信息(如当前使用的收集器,当前的空间使用率等)

       -dump:生成java堆转储快照

       -heap:显示java堆详细信息(只在Linux/Solaris下有效)

       -F:当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照(只在Linux/Solaris下有效)

       -finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalize方法的对象(只在Linux/Solaris下有效)

       -histo:显示堆中对象统计信息

       -permstat:以ClassLoader为统计口径显示永久代内存状态(只在Linux/Solaris下有效)

       

     命令格式:jmap [option] vmid

    其中前面3个参数最重要,如:

    查看对详细信息:jmap -heap 309

    生成dump文件: jmap -dump:file=./test.prof 309

    查看当前堆中对象统计信息: jmap -histo 309:

    该命令显示3列,分别为对象数量,对象大小,对象名称,通过该命令可以查看是否内存中有大对象;

    用jmap把进程内存使用情况dump到文件中,再用jhat分析查看

    jmap进行dump命令格式如下:

    jmap -dump:format=b,file=dumpFileName pid

    我一样地对上面进程ID为21711进行Dump:

    root@ubuntu:/# jmap -dump:format=b,file=/tmp/dump.dat 21711     

    Dumping heap to /tmp/dump.dat ...

    Heap dump file created

    5、jhat

    用于分析使用jmap生成的dump文件,是JDK自带的工具,使用方法为: jhat -J -Xmx512m [file]

    不过jhat没有mat好用,推荐使用mat(Eclipse插件: http://www.eclipse.org/mat ),mat速度更快,而且是图形界面。

  • 相关阅读:
    【机器学习】转导推理——Transductive Learning
    【机器学习】Learning to Rank入门小结 + 漫谈
    【机器学习】Learning to Rank入门小结 + 漫谈
    【机器学习】Learning to Rank 简介
    【机器学习】Learning to Rank 简介
    【机器学习】Learning to Rank之Ranking SVM 简介
    【机器学习】Learning to Rank之Ranking SVM 简介
    【计算机视觉】背景建模--Vibe 算法优缺点分析
    【计算机视觉】背景建模--Vibe 算法优缺点分析
    【机器学习】Jackknife,Bootstraping, bagging, boosting, AdaBoosting, Rand forest 和 gradient boosting
  • 原文地址:https://www.cnblogs.com/lushilin/p/6138598.html
Copyright © 2011-2022 走看看