jvm-命令行监控工具
jps查看正在运行的java进程
jps(java process status)显示指定系统内所有的hotspot虚拟机进程,可用于查询正在运行的虚拟机进程
查询出来的java进程id,就是本地的进程id
如果使用参数:-XX:-UsePerfData(默认开启),那么jps将无法探知该进程
语法
jps [参数] [主机名]
- 可以通过主机名,进行远程监控(需要安装jstatd)
参数
- -q:仅仅显示本地虚拟机唯一id。不显示主类的名称
- -l:输出应用成员主类的全类名(如果执行的是jar包,则输出jar完整路径)
- -m:输出虚拟机进程启动时传递给主类的main()的参数
- -v:列出虚拟机进程启动时的jvm参数。如:-Xms、-Xmx
jstat查看jvm统计信息
jstat(jvm statistics monitoring tool)用于监控虚拟机各种运行状态信息的命令工具。它可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、jit编译等运行数据
语法
jstat 参数 [-t] [-h<lines>] 进程id [查询间隔 [查询的总次数]]
- -t:在输出信息前加上一个Timestamp列(当前一共执行的多少时间,单位:秒)
- -h<lines>:可以在周期数据输出时,输出多少行之后输出一个表头信息
参数
类装载相关:
- -class:显示ClassLoader的相关信息:类的装载、卸载数量、总空间、类装载所消耗的时间等
垃圾回收相关:
- -gc:显示与gc相关的信息。包括eden区、两个surivor区、老年代、永久代等的容量、已使用空间、gc时间合计等信息
- -gccapacity:显示内容与-gc基本相同,但输出主要关注java堆各个区域使用到的最大、最小空间
- -gcutil:显示内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
- –gccause:与-gcutil功能一样,但是会额外输出导致最后一次或当前正在发生的gc产生的原因
- -gcnew:显示新生代gc状况
- -gcnewcapacity:显示内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间
- -gcold:显示老年代gc状况
- -gcoldcapacity:显示内容与-gcold基本相同,输出主要关注使用到的最大、最小空间
- -gcpermcapacity:显示永久代使用到的最大、最小空间
jit相关:
- -compiler:显示jit编译器编译过的方法、耗时等信息
- -printcompilation:输出已经被jit编译的方法
-gc展示信息
新生代相关:
- S0C:第一个幸存者区总容量
- S1C:第二个幸存者区总容量
- S0U:第一个幸存者区已使用容量
- S1U:第二个幸存者区已使用容量
- EC:eden空间的总容量
- EU:eden空间的已使用容量
老年代相关:
- OC:老年代的总容量
- OU:老年代已使用容量
方法区(元空间)相关:
- MC:方法区总容量
- MU:方法区已使用容量
- CCSC:压缩类总容量
- CCSU:压缩类使用容量
其他:
- YGC:年轻代gc发生的次数
- YGCT:年轻代gc花费的时间
- FGC:full gc发生的次数
- FGCT:full gc花费的时间
- GCT:总gc时间(YGCT+FGCT)
jinfo实时查看和修改jvm配置参数
jinfo(configuration info for java)查看虚拟机配置参数信息,也可以用于调整虚拟机的参数配置
在很多情况下,java应用程序不会指定所有的java虚拟机参数。因此,开发人员可能不知道某一个具体的java虚拟机参数的默认值。这种情况下,可能需要通过查找文档获取某个参数的默认值。这个查找过程可能是非常艰难的。但有了jinfo工具,开发人员可以很方便的找到java虚拟机参数的当前值
语法
jinfo 选项 进程id
选项
查看
- no option:输出全部的参数和系统属性
- -flag name:输出对应名称的参数
- -flags:输出全部的参数(赋过值的)
- -sysprops:输出系统属性,也可以通过System.getProperties()获取
修改
jinfo可以在运行时修改部分参数,并立即生效(重启后会失效)。但是,只有被标记为manageable的参数才可以被动态修改
查看被标记为manageable的参数:java -XX:+PrintFlagsFinal -version | grep manageable,Windows下使用findstr替换grep
- -flag [+|-]name:开启或者关闭对应名称的参数(针对boolean类型),
- -flag name=value:设定对应名称的参数(针对非Boolean类型)
jmap导出内存映像文件&内存使用情况
jmap(jvm memory map)一方面是获取dump文件(堆转储快照文件,二进制文件),它还可以获取目标java进程的内存相关信息,包括java堆各区域的使用情况、堆中对象的统计信息、类加载信息等
语法
jmap 选项 进程id
jmap 选项 可执行代码
jamp 选项 远程访问信息
参数
- -dump:生成java堆转储快照:dump文件。-dump:live只保存堆中的存活对象
- -heap:输出整个堆空间的详细信息,包括gc的使用、堆配置信息,以及内存的使用信息等
- -histo:输出堆中对象的统计信息,包括类、实例数量和合计容量。histo:live只统计堆中的存活对象
- -permstat:以ClassLoader为统计口径输出永久代的内存状态信息。仅Linux和solaris平台有效
- -finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalizer方法的对象。仅Linux和solaris平台有效
- -F:当虚拟机进程对-dump选项没有任何响应时,可使用此选项强制生成dump文件。仅Linux和solaris平台有效
- -J <flag>:传递参数给jmap启动的jvm
导出内存映像文件
手动方式:
- jmap -dump:format=b,file=文件名.hprof 进程id
- jmap -dump:live,format=b,file=文件名.hprof 进程id(只打印存活的)
format=b表示标准格式
自动方式(发生oom时自动导出):
- -XX:+HeapDumpOnOutOfMemoryError:发生oom时,导出应用程序的当前堆快照
- -XX:HeapDumpPath=文件名.hprof:可以指定堆快照的保存位置
jhat堆分析
jhat(jvm heap analysis tool)sun jdk提供的jhat命令与jmap命令搭配使用,用于分析jamp生成的heap dump文件。jhat内置了一个微型的http/html服务器,生成dump文件的分析结果后,用户可以在浏览器中查看分析结果
使用jhat命令,就启动了一个http服务,端口是7000
jhat在jdk9之后以已经被删除,官方建议使用VisualVM代替
语法
jhat 参数 dump文件
参数
- -stack false|true:打开或关闭对象分配调用栈跟踪
- -refs false|true:开启或关闭对象引用跟踪
- -port 端口号:设置jhat的端口号,默认7000
- -exclude 排除文件:执行对象查询时需要排除的数据成员
- -baseline 排除文件:指定一个基准堆转储
- -debug 级别:设置debug级别
- -version:启动后显示版本信息就退出
- -J 启动参数:传入启动参数,比如:-J -Xmx512m
jstack打印jvm中线程快照
jstack(jvm stack trace)用于生成虚拟机指定进程当前时刻的线程快照(虚拟机堆栈跟踪)。线程快照就是当前虚拟机内指定进程的每一条线程正在执行的方法堆栈的集合
作用:定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部资源导致长时间等待等问题
也可以使用java代码:Thread.getAllStackTraces() 追踪当前进程中的所有线程
语法
jstack 参数 进程id
参数
- -f:当正常输出的请求不被响应时,强制输出线程堆栈
- -l:除堆栈外,显示关于锁的附加信息
- -m:如果调用到本地方法的话,可以显示c/c++的堆栈
jcmd多功能命令行
在jdk1.7之后,新增了一个命令行工具jcmd
它是一个多功能的工具,可以用来实现之前所有命令的功能
用法
- jcmd -l和不加参数就等同于jps
- jcmd 进程id help:针对指定进程,列出所有命令
- jcmd 进程id Thread.print:可以替换jstack
- jcmd 进程id GC.heap_dump 文件名.hprof:可以替换jmap生成dump文件
jstatd远程主机信息收集
某些工具支持远程计算机的监控(如jps、jstat)。为了启用远程监控,则需要配合使用jstatd工具
命令jstatd是一个rmi服务端程序,它的作用相当于代理服务器,建立本地计算机与远程监控工具的通信。jstatd服务器将本机的java应用程序信息传递到远程计算机