上一节认识了 JVM 参数和jps命令的使用,这一节来学习下jinfo,jstat,jmap的使用,话不多说,开始。
jinfo
功能描述: jinfo也是jvm中的一个命令,可以查看运行中jvm的全部参数,还可以设置部分参数。
格式:
`jinfo [ option ] pid` `jinfo [ option ] executable core` `jinfo [ option ] [server-id@]remote-hostname-or-IP`
参数说明:
pid: 对应jvm的进程id executable core: 产生core dump文件 [server-id@]remote-hostname-or-IP: 远程的ip或者hostname,server-id标记服务的唯一性id
option列表:
no option 输出全部的参数和系统属性 -flag name 输出对应名称的参数 -flag [+|-]name 开启或者关闭对应名称的参数 -flag name=value 设定对应名称的参数 -flags 输出全部的参数 -sysprops 输出系统属性
实际场景:
有时候我们需要查看指定 Java 进程的全部参数或者指定参数,这个时候我们就可以使用jps+jinfo命令来查看具体Java进程的参数。
例1:查看指定Java进程的全部参数
例2:查看指定Java进程的最大内存
jstat
功能描述:jstat也是jvm中的一个命令,jstat可以查看JVM统计信息:类加载,垃圾收集,JIT编译。
格式:
参数说明:
-t: 可以在打印的列加上Timestamp列,用于显示系统运行的时间
-h: 可以在周期性数据数据的时候,可以在指定输出多少行以后输出一次表头
vmid: Virtual Machine ID( 进程的 pid)
interval : 执行每次的间隔时间,单位为毫秒
count: 用于指定输出多少次记录,缺省则会一直打印
option: 具体信息的类型
option列表:
-class 显示ClassLoad的相关信息; -compiler 显示JIT编译的相关信息; -gc 显示和gc相关的堆信息; -gccapacity 显示各个代的容量以及使用情况; -gcmetacapacity 显示metaspace的大小 -gcnew 显示新生代信息; -gcnewcapacity 显示新生代大小和使用情况; -gcold 显示老年代和永久代的信息; -gcoldcapacity 显示老年代的大小; -gcutil 显示垃圾收集信息; -gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因; -printcompilation 输出JIT编译的方法信息;
实际场景:
有时候我们想要看到指定Java进程的JVM统计信息,这个时候就可以使用jps+jstat来完成。
例1:每隔1秒显示加载class的数量,及所占空间等信息,输出10次
例2:显示gc相关的堆信息,查看gc的次数,及时间
jstat其他的option选项,感兴趣的小伙伴们自己操作实验把,这边篇幅有限,就不一一举例了。
jmap
功能描述:jmap命令可以获得运行中的jvm的堆的内存快照,从而可以离线分析 堆内存 情况,以检查 内存泄漏 ,检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等,还可以使用jmap生成HeapDump。
实例场景:
一般当我们遇到内存溢出的问题时,由于生产上代码和环境比较复杂,我们需要去根据内存映像文件来具体分析。那么如何导出内存映像文件呢?有两种方式,一种是配置参数,一种是jmap。
第一种方式:配置参数,内存溢出自动导出内存映像文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
第二种方式:jmap手动导出内存映像文件
今天讲解了jinfo,jstat,jmap的相关作用和使用,下一节为大家带来jmap+mat内存分析实战。