JVM管理分析工具介绍

本文介绍一下JDK的bin目录下自带的一些管理分析工具,例如jpsjstatjmap、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 查询帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值