本文介绍一下JDK的bin目录下自带的一些管理分析工具,例如jps、jstat、jmap、javap等(注:我本地为win10,要想直接在cmd中执行这些命令需要配置环境变量到bin层)
jps
1. 说明:jps 命令类似linux的ps命令,但是它只列出系统中所有的 Java 应用程序(即linux中的 ps -ef | grep java)。通过jps命令可以方便地查看 Java 进程的启动类、传入参数和虚拟机参数等信息。
2. 参数
· -q:只输出进程 ID
· -m:输出传入 main 方法的参数
· -l:输出完全的包名,应用主类名,jar的完全路径名
· -v:输出jvm参数
· -V:输出通过flag文件传递到JVM中的参数
3. 用法:直接执行jps,不带参数默认显示进程ID和启动类的名称。
4. 原理:Java程序在启动后,会在临时文件夹下生成一个类似于hsperfdata_UserName的文件夹,在这个文件夹下会有以Java进程PID为名称的文件,当运行jps命令时,就会找到这些文件再解析。
jstat
1. 说明:jstat命令用于JVM运行时对Java应用程序的资源和性能进行实时的命令行的监控,例如查看类加载器、JIT编译器、Heap size、GC等相关信息的监控。
2. 参数:
· option: 参数选项
· -t: 可以在打印的列加上Timestamp列,用于显示系统运行的时间
· -h: 可以在周期性数据数据的时候,可以在指定输出多少行以后输出一次表头
· vmid: Virtual Machine ID( 进程的 pid)
· interval: 执行每次的间隔时间,单位为毫秒
· count: 用于指定输出多少次记录,缺省则会一直打印
option 参数:
· -class 显示ClassLoad的相关信息
· -compiler 显示JIT编译的相关信息
· -gc 显示和gc相关的堆信息
· -gccapacity 显示各个代的容量以及使用情况
· -gcmetacapacity 显示metaspace的大小
· -gcnew 显示新生代信息
· -gcnewcapacity 显示新生代大小和使用情况
· -gcold 显示老年代和永久代的信息
· -gcoldcapacity 显示老年代的大小
· -gcutil 显示垃圾收集信息
· -gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因
· -printcompilation 输出JIT编译的方法信息
3. 用法:此处以option中得-gc为例,执行jstat -gc PID。
· S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
· S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
· S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
· S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
· EC :年轻代中Eden(伊甸园)的容量 (字节)
· EU :年轻代中Eden(伊甸园)目前已使用空间 (字节)
· OC :Old代的容量 (字节)
· OU :Old代目前已使用空间 (字节)
· MC:metaspace(元空间)的容量 (字节)
· MU:metaspace(元空间)目前已使用空间 (字节)
· YGC :从应用程序启动到采样时年轻代中gc次数
· YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
· FGC :从应用程序启动到采样时old代(全gc)gc次数
· FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
· GCT:从应用程序启动到采样时gc用的总时间(s)
4. 原理:Java程序在启动后,会在临时文件夹下生成一个类似于hsperfdata_UserName的文件夹,在这个文件夹下会有以Java进程PID为名称的文件,JVM运行时会将相关数据存放到PID对应的文件中,该文件通过 mmap的方式映射到内存中,当运行jstat 时会通过 DirectByteBuffer 读取内存中的数据。
jinfo
1. 说明:用来查看正在运行的java应用程序的参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的JVM一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息。
2. 参数:
· -flag name 输出对应名称的参数
· -flag [+|-]name 开启或者关闭对应名称的参数
· -flag name=value 设定对应名称的参数值
· -flags 输出JVM参数
· -sysprops 输出系统属性(相当于System.getProperites())
3. 用法:这里以-flags为例,执行jinfo -flags PID。
-Xms:初始堆大小,默认为物理内存的1/64(<1GB);默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制
-Xmx:最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
-Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。与jmap -heap中显示的New gen是不同的。整个堆大小=新生代大小 + 老生代大小 + 永久代大小。在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-XX:SurvivorRatio:新生代中Eden区域与Survivor区域的容量比值,默认值为8。两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。
-Xss:每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。应根据应用的线程所需内存大小进行适当调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。一般小的应用,建议128k,大的应用建议256k。这个选项对性能影响比较大,需要严格的测试。
-XX:PermSize:设置永久代(perm gen)初始值。默认值为物理内存的1/64。
-XX:MaxPermSize:设置持久代最大值。物理内存的1/4。
jmap
1. 说明:jmap是一个多功能命令。可以生成java程序的dump文件,也可以查看堆内对象示例的统计信息、查看ClassLoader信息何finalizer 队列。
2. 参数:
· no option: 查看进程的内存映像信息,类似 Solaris pmap 命令
· heap: 显示Java堆详细信息
· histo[:live]: 显示堆中对象的统计信息(:live表示只显示存活对象)
· clstats:打印类加载器信息
· finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
· dump:<dump-options>:生成堆转储快照
· F: 当-dump没有响应时,使用-dump或者-histo参数,live子参数无效
· help:打印帮助信息
· J<flag>:指定传递给运行jmap的JVM的参数
3. 用法:此处以-histo:live为例
· num:序号
· instances:实例数量个数
· bytes:占用空间 (字节)
· class name:类全限定名
4. 原理:jmap与jvm进行通信有两种实现方式:attach和SA。
Attach:attach方式即客户端和服务端之间的通信,客户端发送请求,主要逻辑在服务端执行,jmap相当于客户端,JVM相当于服务端。在JVM中,有一个"Attach Listener"的线程,负责监听attach的请求,并执行对应的操作。
SA:SA的主要逻辑在客户端执行,只是从JVM获取数据,位于JAVA_HOME/lib/sa-jdi.jar。
jmap操作默认采用通讯机制:
-dump和-histo[:live] 默认使用的是VirtualMachine.attach
-pmap 、-heap、-J默认使用的是SA
-F可以把默认使用VirtualMachine.attach的方式改成SA attach方式
javap
1. 说明:javap是jdk自带的反解析工具。它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。
2. 参数:
· -v/-verbose:输出附加信息(包括行号、本地变量表,反汇编等详细信息)
· -l:输出行号何本地变量表
· -public: 只显示公共类和成员
· -protected:只显示受保护的/公共类和成员
· -p/private: 显示所有类和成员
· -package:显示程序包/受保护的/公共类 和成员 (默认)
· -c:对代码进行反汇编
· -s:输出内部类型签名
· -sysinfo:显示正在处理的类的系统信息 (路径, 大小, 日期, MD5 散列)
· -constants:显示静态最终常量
· -classpath <path>:指定查找用户类文件的位置
· -bootclasspath <path>:覆盖引导类文件的位置
2. 用法:此处以查看JVM指令为例,执行java -v classFilePath
输出信息具体含义参照JVM指令表
其他(可视化工具)
1. jvisualvm:监控JVM的运行情况,用于查看和浏览Heap Dump、Thread Dump、内存对象实例情况、GC执行情况、CPU消耗以及类的装载情况。
2:jconsole:主要监控JVM的概览、内存、线程、类、vm概要、MBean等内容。
备注:以上只是大致介绍了一下部分常用的管理分析工具,可能参数、用法、原理等介绍不全,请自行通过 对应命令 -help 查询帮助。