zoukankan      html  css  js  c++  java
  • Java虚拟机------JVM分析工具

    主要介绍JVM的分析工具:

    jps

    jps:Java Virtual Machine Process Status Tool
    
    http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html
    
    jps [ options ][ hostid ]
    
    		 -q 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数
    
    		-m -m 输出传递给main 方法的参数,在嵌入式jvm上可能是null
    
    		-l  输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名
    
    		-v 输出传递给JVM的参数
    
    jps host
    
    查看host的jps情况(前提:host提供jstatd服务)
    

     JVM分析工具-jmap1

    Memory Map 观察运行中的jvm物理内存的占用情况。
    
    官方地址:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jmap.html
    
     	jmap [ option ] pid
    
    	pid   进程号(常用)
    
    	参数如下:
    
    		-heap:打印jvm heap的情况(垃圾收集器类型)
    
    		-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
    
    		-histo:live :同上,但是只打印存活对象的情况
    	
    		-permstat:打印permanent generation heap(方法区)情况
    
    		-finalizerinfo:打印正等候回收的对象信息
    Memory Map 观察运行中的jvm物理内存的占用情况。
    
    官方地址:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jmap.html
    
     	jmap [ option ] pid
    
    	pid   进程号(常用)
    
    	参数如下:
    
    	-heap:打印jvm heap的情况(垃圾收集器类型)
    
    	-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
    
    	-histo:live :同上,但是只打印存活对象的情况
    
    	-permstat:打印permanent generation heap(方法区)情况
    
    	-finalizerinfo:打印正等候回收的对象信息
    
    用jmap把进程内存使用情况dump到文件中,再用jhat分析查看。jmap进行dump命令格式如下:
    
    jmap -dump:format=b,file=dumpFileName pid
    
    jmap -dump:format=b,file=4574.heap20151215  4574
    
    Dumping heap to 4574.heap20151215
    
    Heap dump file created
    
    dump出来的文件可以用MAT、VisualVM等工具查看,这里用jhat查看:
    
    jhat -port 9998 /tmp/dump.dat
    
    注意如果Dump文件太大,可能需要加上-J-Xmx512m这种参数指定最大堆内存,即jhat -J-Xmx512m -port 9998 /tmp/dump.dat。然后就可以在浏览器中输入主机地址:9998查看了。
    

    jinfo

    Configuration Info
    
    官方地址:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jinfo.html
    
    jinfo [ option ] pid
    
    pid   进程号
    
    参数如下:
    
    		no option  打印命令行参数和系统属性
    
    		-flags  打印命令行参数
    
    		-sysprops  打印系统属性
    	
    		-h  帮助
    

    jstack1

    jstack:Stack Trace
    
    http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html
    
    jstack能得到运行java程序的java stack和native stack的信息。可以轻松得知当前线程的运行情况
    
    jstack [ option ] pid
    
    [ option ] 参数如下
    
    		-l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
    
    		-m打印java和native c/c++框架的所有栈信息.
    
    tid指Java Thread id。nid指native线程的id。prio是线程优先级。[0x00007fd4f8684000]是线程栈起始地址
    
    dump 文件里,值得关注的线程状态有:
    
    死锁,Deadlock(重点关注)
    
    等待资源,Waiting on condition(重点关注)
    
    等待获取监视器,Waiting on monitor entry(重点关注)
    
    阻塞,Blocked(重点关注) 
    
    执行中,Runnable  
    
    暂停,Suspended
    
    对象等待中,Object.wait() 或 TIMED_WAITING
    
     停止,Parked
    

    jstat

    jstat: Java Virtual Machine Statistics Monitoring Tool
    
    http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html
    
     Usage: jstat -help|-options
    
          jstat -<option> [-t][-h] <pid> [<interva[s|ms]> [<count>]]
    
    参数解释:
    
    Options — 选项,我们一般使用 -gcutil /-gc 查看gc情况
    
    pid      — VM的进程号,即当前运行的java进程号
    
    interval[s|ms]  ——  间隔时间,单位为秒或者毫秒,默认为ms。必须是正整型。
    
    count     — 打印次数,如果缺省则打印无数次
    
    例如:jstat -gc 4645 500 10  表示查看进程号为4645的gc 每500ms打印一次  共打印10次
    
    S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
    S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
    S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
    S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
    EC:年轻代中Eden(伊甸园)的容量 (字节)
    EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
    OC:Old代的容量 (字节)
    OU:Old代目前已使用空间 (字节)
    PC:Perm(持久代)的容量 (字节)
    PU:Perm(持久代)目前已使用空间 (字节)
    YGC:从应用程序启动到采样时年轻代中gc次数
    YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
    FGC:从应用程序启动到采样时old代(全gc)gc次数
    FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
    GCT:从应用程序启动到采样时gc用的总时间(s)
    

     jstat -gccapacity pid

    NGCMN:年轻代(young)中初始化(最小)的大小 (字节)
    NGCMX:年轻代(young)的最大容量 (字节)
    NGC:年轻代(young)中当前的容量 (字节)
    OGCMN:old代中初始化(最小)的大小 (字节) 
    OGCMX:old代的最大容量 (字节)
    OGC:old代当前新生成的容量 (字节)
    PGCMN:perm代中初始化(最小)的大小 (字节) 
    PGCMX:perm代的最大容量 (字节)   
    PGC:perm代当前新生成的容量 (字节)
    S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
    S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
    E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
    O:old代已使用的占当前容量百分比
    S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
    S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
    ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
    DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
    TT: 持有次数限制
    MTT : 最大持有次数限制
    

    jvm分析工具-jconsole

    可视化的jvm监控软件。
    
    可以监控本地或者远程进程。
    
    主要包括:概览、内存、线程、类、VM概要、MBean选项卡。
    
    概览选项卡:呈现四幅图表:主要包括堆内存使用量、类、线程、CPU占有率。
    
    内存选项卡:包含堆内、非堆、内存池的使用量图表和详细信息。相当于jstat命令。
    
    线程选项卡:显示所有的线程的信息和图表。相当于jstack
    
    类选项卡:加载的类的信息。
    
    Vm概要:VM的概要信息包括堆大小,垃圾收集信息、vm参数等。
    
    Mbean选项:managed beans ,被管理的beans
    

    jvm分析工具-jmx

    JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。
    开启jmx:
    无需验证的配置:
    -Dcom.sun.management.jmxremote 
    -Dcom.sun.management.jmxremote.authenticate=false 
    -Dcom.sun.management.jmxremote.port=1234 
    -Dcom.sun.management.jmxremote.ssl=false
    将-Dcom.sun.management.jmxremote.authenticate=false 去掉就是需要验证信息即:登录名和密码:验证用户的配置文件在$java_home/jre/lib/management/jmxremote.password
    默认有一个$java_home/jre/lib/management/jmxremote.password.template
    修改下即可。
    jmxremote.password.template默认是只读权限。
    并更改为可写的权限 chmod a+w jmxremote.password
    修改后把jmxremote.password的读权限取消 a-r 。否则会提示:Error: Password file read access must be restricted: 
    management/jmxremote.access配置下权限。
    连接时指定ip:端口和jmx连接即可。
    远程的线程dump可以dump查看,堆的dump是需要从远程拉到本地来查看。
    

     jconsole和jvisualvm远程

    jconsole:
    在连接界面有显示本地连接或者远程连接,输入相应的主机名和jmx的端口号即可。
    jvisualvm:
    在远程的选项添加计算机,然后右键添加jmx连接或者jstatd连接。
    
  • 相关阅读:
    final关键字
    this and super
    java 内存分析之static
    java 内存分析之this
    java 内存分析之方法返回值二
    java 内存分析之方法返回值及匿名对象一
    java 内存分析之构造方法执行过程
    java 内存分析之堆栈空间
    java jvm概述及工作过程中的内存管理
    java 编译器
  • 原文地址:https://www.cnblogs.com/fmgao-technology/p/10407429.html
Copyright © 2011-2022 走看看