JVM(八)——一些工具的总结

前言

之前参照一些书籍对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工具的一些总结,并结合了实例弄了一堆动图

发布了129 篇原创文章 · 获赞 37 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/liman65727/article/details/103846749