jdk在安装的时候会提供一些性能分析、故障诊断、JVM监控之类的工具,了解这些工具对我们分析JVM内存、JVM调优有一定的帮助,本篇文章来学习一下。
jps(JVM Process Status)是查看正在运行的虚拟机进程的工具。jps能获取进程id,所以会被经常使用。在 linux 中,一般自带了 OpenJdk,一般情况下 JPS 等命令不能用,要么选择去安装 JPS 等插件,要么把 OpenJdk 卸载,重新安装 Oracle 的 JDK。
「语法」:jps [ options ] [ hostid ]
参数 | 含义 |
---|---|
-q | 只显示进程 |
-m | 输出主函数传入的参数 |
-l | 输出应用程序主类完整 package 名称或 jar 完整名称. |
-v | 列出 jvm 参数 |
-V | 只生成本地JVM标识符列表 |
-J | 向JVM传递参数。例如:-J-Xms48m,设置JVM初始内存为48m |
测试:
57312 JvmToolsApplication
这个是我运行的一个用于测试的springboot项目。
jstat(JVM Statistics Monitoring Tool )是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据,在没有 GUI 图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。
语法:jstat [ generalOption | outputOptions vmid [ interval[s|ms] [ count ] ]
-help
:帮助信息-options
:对应着下面的outputOptions参数 | 含义 |
---|---|
-class | 显示类加载器行为信息 |
-compiler | 显示有关JVM实时编译器行为的统计信息 |
-gc | 显示有关GC堆行为的统计信息。 |
-gccapacity | 显示各分区大小 |
-gccause | 显示最近一次 GC 统计信息和原因 |
-gcnew | 显示新生代行为的统计信息。 |
-gcnewcapacity | 显示新生代内存大小 |
-gcold | 显示老年代统计信息 |
-gcoldcapacity | 显示老年代内存大小 |
-gcmetacapacity | 显示元空间内存大小 |
-gcutil | 显示GC统计汇总信息 |
-printcompilation | 显示HotSpot 编译统计信息 |
outputOptions参数后面还能加以下可选参数:
- -h n:每n个样本(输出行)显示一个列标题,默认值为0,显示列标题的第一行数据。
- -t:第一列显示为时间戳
- -J:向应用程序传递启动参数
测试:
57312 是测试项目JvmToolsApplication在虚拟机中的进程id。
jstat -gc 57312 100 10
这个命令是在100ms内获取10次gc统计信息结果中的列分别代表以下意思:
jinfo(Configuration Info for Java) 可以实时地查看和调整虚拟机的各项参数。jinfo不仅能获取到虚拟机命令行参数,还能获取到系统参数。
语法:
jinfo [ option ] pid
:查看和调整本地进程虚拟机参数option:
测试:
java -XX:+PrintFlagsFinal –version
命令获取虚拟机参数,这是一个很长的列表,其中红框部分如果是manageable则表示可以在运行时修改。我们就随便找一个参数UseTLAB进行查询,可以看到它是否开启
-XX:+PrintGC -XX:SurvivorRatio=6
:重启项目,并通过jps获取到进程id
再通过jinfo -flags 67776
命令获取项目启动参数
还可以获取上面配置的某一个参数jinfo -flag SurvivorRatio 67776
通过 jinfo 命令,我们可以在生产上临时打开一下 GC日志或者进行一些数据的配置(不需要重启应用条件下),也是我们去排查问题的一个关键命令。
jmap(Memory Map for Java) 打印给定进程或远程调试服务器的共享对象内存映射或堆内存详细信息。jmap也可用于生成堆转储快照(一般称为 heapdump 或 dump 文件),除此之外它还可以查询 finalize 执行队列、Java 堆和永 久代的详细信息,如空间使用率、当前用的是哪种收集器等。和 jinfo 命令一样,jmap 有不少功能在 Windows 平台下都是受限的,除了生成 dump 文件的 -dump 选项和用于查看每个类的实例、空间占用统计的-histo 选项在所有操作系统都提供之外,其余选项都只能在 Linux/Solaris 下使用。
语法:jmap [ options ] pid
options 有如下选项:
概要信息含义:
Heap Configuration: ##堆配置情况,也就是 JVM 参数配置的结果[平常说的 tomcat 配置 JVM 参数,就是在配置这些]
MinHeapFreeRatio = 0 //最小堆使用比例
MaxHeapFreeRatio = 100 //最大堆可用比例
MaxHeapSize = 4261412864 (4064.0MB) //最大堆空间大小
NewSize = 88604672 (84.5MB) ) //新生代分配大小
MaxNewSize = 1420296192 (1354.5MB) //最大可新生代分配大小
OldSize = 177733632 (169.5MB) //老年代大小
NewRatio = 2 //新生代比例
SurvivorRatio = 6 //新生代与 suvivor 的比例
MetaspaceSize = 21807104 (20.796875MB) //元空间大小
CompressedClassSpaceSize = 1073741824 (1024.0MB) //类指针压缩空间大小
MaxMetaspaceSize = 17592186044415 MB // 最大元空间大小
G1HeapRegionSize = 0 (0.0MB) //G1收集器Region单元大小
Heap Usage: //堆内存实际的使用情况
PS Young Generation //新生代
Eden Space: //Eden 区
capacity = 66584576 (63.5MB) //Eden容量
used = 27941200 (26.646804809570312MB) //Eden区已使用大小
free = 38643376 (36.85319519042969MB) //未使用
41.96347214105561% used //使用比例
From Space: //survior1 区
capacity = 11010048 (10.5MB)
used = 8497840 (8.104171752929688MB)
free = 2512208 (2.3958282470703125MB)
77.18258812313988% used
To Space: //survior2 区
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
PS Old Generation //老年代使用情况
capacity = 115867648 (110.5MB)
used = 10553152 (10.06427001953125MB)
free = 105314496 (100.43572998046875MB)
9.10793666925905% used
jmap –histo:live <pid>
,live参数表示统计活跃状态的对象-histo 打印的实例数目太多了,看不过来,显示那么多也没什么用,所以在Linux系统上可以使用jmap –histo <pid> | head -10
命令只展示前10行,具体行数可以自己定义。
通过-dump命令可以在指定文件夹生成dump文件,之后再搭配jhat来分析dump文件,dump文件的后缀也可以是hprof
或者bin
,dump文件本身是一个二进制文件。
jhat (Heap Dump Browser)可以让一个dump文件以web服务的的形式访问。
上面我们用jmap工具生成了一个dump文件,现在可以通过jhat 工具,让它再浏览器端访问到。
Server is ready表示启动成功,端口号为7000,然后在浏览器端访问http://localhost:7000/,可以看到dump文件内容
语法:jhat [ options ] heap-dump-file
jhat命令在JDK9、JDK10中已经被删除了,官方建议使用VisualVM代替。
jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主 要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。
语法:jstack [ options ] pid
options 选项:
对于桌面操作系统,java提供了jconsole和jvisualvm可视化工具。可视化工具就是将上面几个命令行工具整合到一起使用的一个工具。
jconsole命令启动一个图形控制台工具,该工具允许您监视和管理本地或远程计算机上的Java应用程序和虚拟机。
命令行输入Jconsole
命令
选择要监控的程序,可选择本地进程也可以选择远程进程,如果选择远程进程的话要在服务器开启JMX,一般不开启。
进入控制台首页
sun.desktop
,就会弹出对应的属性值。JConsole启动的时候还可以附加其他参数:
jvisualvm是一个监控运行时java应用程序的图形界面工具。jvisualvm大致和Jconsole差不多,就是多了抽样器和profiler,感兴趣的可以自己试一下。
命令行输入jvisualvm
就可以启动jvisualvm可视化界面了。
选择要查看的应用程序就可以进入监控界面
jhat命令是用来加载jmap生成的dump文件的,前面不是说官方建议使用VisualVM代替jhat命令嘛,那就是说jvisualvm也可以加载dump文件。
选择堆dump
打开就能看到之前生成的dump文件里面的内容了
jvisualvm还可以安装插件
这里选择安装Visual GC
安装好之后就可以看到jvm内存变化情况,通过Visual GC可以很好地理解JVM运行时区域信息。
以上就是关于JVM的一些优化工具,这里只是简单的介绍了一下,有兴趣的可以深入了解一下,对JVM进行优化时大有用处。