前言
之前参照一些书籍对JDK自带的一些工具进行了一些总结,但是非常凌乱,这一篇博客同样也是总结这些工具。原博客地址——JDK自带的命令工具
JVM参数
标准参数
标准参数不会随着JDK版本的变化而变化,万年都存在且万年不变。
-version
-help
-server
-cp
如以上四个即为标准参数
-X参数
即为非标准参数,会随着JDK的版本变动而变化。
-Xint
切换成解释执行的模式
-Xcomp
第一次使用就编译成本地的代码
-Xmixed
混合模式,何时采用上述模式的其中之一,由JVM自己决定。
-XX参数
前面介绍的两种参数并不是十分常用,我们进行JVM调优长期打交道的就是-XX类的参数。这类参数非常多,大体上分两类
boolean类型
一般的格式为 -XX:[+/-]paramName
+表示启动,-表示停止。
例如:
-XX:+UseConcMarkSweepGC
——使用CMS类型的垃圾收集器
非boolean类型
一般设置某些阈值。一般格式为 -XX:name=value
例如:-XX:MaxHeapSize=100M——设置堆的最大空间为100M。
其他参数
其实这类参数可以归结为是属于-XX参数的,只是形式上有些不同而已
-Xms100
等价于 -XX:InitialHeapSize=100
-Xss100
等价于 -XX:TreadStackSize=100
如何查看应用程序的JVM参数
1、控制台中可以通过 -XX:+PrintFlagsFinal
参数来打印所有的JVM参数项
2、在应用程序中指定该参数,可以打印出该应用程序所设置的JVM参数项,如下动图所示:
可以看到控制台输出了所有已经设置的JVM参数。
可以通过jinfo命令查看某一个虚拟机参数。
如何设置JVM参数
1、开发工具中通过编辑启动参数进行修改
2、运行jar包的时候,通过java -XX:参数进行修改
3、web容器(tomcat)的启动脚本中进行修改
4、通过jinfo实时调整某个java进程的参数(这里只能修改被标记为manageable的flags可以被实时修改)
常用的JVM参数
参考如下大牛总结的博客即可(同时也可以直接去Oracle官网撸)常用的JVM参数
常用的JDK命令
jps
查看当前环境中运行的java线程,如下动图所示(还有一些其他参数,参看一些资料即可):
加上-l参数可以显示每一个应用程序的启动类
jinfo
jinfo可以实时查看和调整JVM的配置参数
查看
jinfo -flag [paramName] PID
查看某一个java进程某个具体的JVM参数
如下动图所示:
jinfo -flags PID
查看曾经赋值过的一些JVM参数,如下动图所示:
修改
jinfo -flag [name]=[value] PID
或者 jinfo -flag [+|-][paraName]
(针对boolean类的参数)。
这里只能修改被标记为manageable的参数。如以下动图所示:
jstat
这个命令比较牛逼
jstat -class PID param1 param2
例如:jstat -class PID 1000 10 查看某个java进程的类加载信息,每1000毫秒输出一次,总共输出10次。如下动图所示
jstack
用于查看线程状态的,比较实用,总结起来篇幅较长,这里暂时不展开,贴上一个大牛的总结——jstack简单实例
用法 jstatck PID
jmap
用户查看堆的相关信息,比较重要的一个命令。可以生成堆内存的快照。
控制台查看堆信息
jmap -heap PID
,直接指定PID即可,如下动图
dump出堆的快照
1、手动dump
jmap -dump:format=b,file=[filename].hprof PID
如下动图中,默认生成的dump文件就在当前系统用户目录下。
2、出现异常自动dump
线上手动dump并没有多大意义,更多的时候我们希望出现OOM的时候自动dump文件。这个通过设置JVM参数就可以实现。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=[filePath+fileName].hprof
这里不举动图实例了。
关于dump下来的如何分析后面会总结。
常用的工具
如果生产中一直用黑框,用手动撸,这就太痛苦了。于是就有了很多工具可以通过界面金进行操作和监控。这些有JDK自带的,也有第三方开发的,已经非常强大了
jconsole
JDK 自带的可视化工具,在控制台中通过jconsole命令就可以启动,如下动图所示:
jvisualvm
也是jdk自带的可视化工具,在控制台中通过jvisualvm即可启动,如下动图所示:
之前在总结OOM的时候介绍的visual GC的插件可以在jvisualvm中点击插件就可以安装。
jvisualvm可以监控远程的java进程,这个就无法通过动图展示了,可以参考大牛的博客——jvisualvm 监控远程java进程
这里需要说明的是:如果采用的是阿里云的服务器,需要设置一下网络的安全组策略,同时需要映射一下IP。
Arthas
阿里大佬开发的一个工具,采用命令交互的方式,排查JVM问题的时候不需要重启服务。
通过curl命令下载即可,github地址:Arthas 文档
MAT
这个几乎无人不知,无人不晓了,这里列举一个简单的使用MAT的实例。这个就是一个Java堆的分析器,直接用于查找内存泄漏的问题。
我们通过jmap命令或者通过JVM设置的参数,生成的dump文件,我们直接打开是无法分析的,需要通过MAT等进行分析。
dump文件中包含:所有的对象信息,所有的类信息,所有的GC Roots信息,所有的线程和本地变量表。
Top Consumers中列举了所有的大对象。 Reports中列出了内存泄漏的可能原因。
PerfMa
一种在线分析dump文件的工具。
查看GC日志的工具
在线的gceasy和GCViewer等,关于GC日志相关内容,下一篇博客中会进行总结。通过GC可以分析停顿时间和吞吐量。
总结
这篇博客是对之前JDK工具的一些总结,并结合了实例弄了一堆动图