JVM系列整体栏目
内容 | 链接地址 |
---|---|
【一】初识虚拟机与java虚拟机 | https://blog.csdn.net/zhenghuishengq/article/details/129544460 |
【二】jvm的类加载子系统以及jclasslib的基本使用 | https://blog.csdn.net/zhenghuishengq/article/details/129610963 |
【三】运行时私有区域之虚拟机栈、程序计数器、本地方法栈 | https://blog.csdn.net/zhenghuishengq/article/details/129684076 |
【四】运行时数据区共享区域之堆、逃逸分析 | https://blog.csdn.net/zhenghuishengq/article/details/129796509 |
【五】运行时数据区共享区域之方法区、常量池 | https://blog.csdn.net/zhenghuishengq/article/details/129958466 |
【六】对象实例化、内存布局和访问定位 | https://blog.csdn.net/zhenghuishengq/article/details/130057210 |
【七】执行引擎,解释器、JIT即时编译器 | https://blog.csdn.net/zhenghuishengq/article/details/130088553 |
【八】精通String字符串底层机制 | https://blog.csdn.net/zhenghuishengq/article/details/130154453 |
【九】垃圾回收底层原理和算法以及JProfiler的基本使用 | https://blog.csdn.net/zhenghuishengq/article/details/130261481 |
【十】垃圾回收器的种类以及内部的执行原理 | https://blog.csdn.net/zhenghuishengq/article/details/130261481 |
【十一】jvm性能调优篇之命令行工具的基本使用 | https://blog.csdn.net/zhenghuishengq/article/details/130641456 |
【十二】jvm性能调优篇之GUI工具的基本使用 | https://blog.csdn.net/zhenghuishengq/article/details/130745931 |
命令行工具或者组合可以获取到Java应用性能相关的基础信息,但是也存在着一定的局限性,如无法获取到方法级别的数据分析,方法之间的调用关系,调用的次数和调用的时间等,并且使用命令行工具时,需要登录到Java应用所在的虚拟机上,使用起来不是很方便,并且最后通过终端将数据输出展示,不够直观。 因此为了解决命令行工具所带来的问题,则有了GUI工具的诞生。
在图形化工具中,主要分为JDK自带工具和一些第三方工具,JDK自带工具主要有 jConsole,visual VM、JMC 等,第三方工具主要有MAT、JProfiler、Arthas、Btrace。jconsole和visual VM是必须要了解和掌握的,JProfiler和Arthas是属于第三方的,相对于前二者,第三方工具的功能会更多和更强大
jconsole是用于对jvm内存、线程和类的监控,是一个基于JMX的GUI性能的监控工具。可以在jdk安装目录下面的bin目录下面找到这个jconsole.exe双击进行启动,也可以直接通过在cmd命令中输入jconsole将此工具打开,打开后的界面如下
jconsole的连接方式有三种,分别是Local本地连接,Remote远程连接、Advanced连接,使用远程连接的话需要通过一个JMX的代理,并且设置对应的用户名和密码,从而进行授权。而使用本地连接需要注意的是,启动本地代码的用户和启动jconsole的用户得是同一个用户。
这里以本地连接为例,随便运行一段代码,然后在cmd命令行工具中输入jconsole,随后不需要通过jps就可以在本地进程中找到其进程号,然后再双击进去这个进程里面,就可以发现以下的界面,通过下图可以发现,在该界面中,可以实时的监控着堆内存、线程、类、cpu占用率的使用情况。
如其内存的监控情况如下,会显示堆内存和非堆内存的信息,堆内存又会分成Eden区和Survivor区,并且每时每秒都对内存进行监控着,其折线图如下,代表的是内存达到一定的量就会触发一次GC
同时也对线程每时每秒的进行监控着,同时这里面还有监测死锁的功能,jstack所对应的GUI
并且可以通过 VM概要 得知一些新生代老年代使用的垃圾收集器的名称,操作系统,jvm供应商等信息
Visual VM是一个功能强大的多合一的故障诊断和性能监控的可视化工具,集成了多个JDK命令行工具,使用他可以显示虚拟机进程的配置和环境的信息(jps,jinfo),监视应用程序的CPU,GC,堆,方法区以及线程的信息(jstack,jstat)等,甚至可以代替jConsole的使用。
Visual VM不仅自身功能强大,他还有一个特点就是支持插件的扩展,并且插件的安装也很方便。如之前安装过的这个查看这个Visual GC的这个插件。打开这个Visual VM只需要找到jdk的安装目录下的bin目录,找到这个JVisual VM双击即可打开。
又主要分为远程监控和本地监控,远程监控这里暂时不考虑,主要是本地监控,这里会监控着所有的jvm进程。
可以直接在进程右键生成堆Dump的快照文件和线程的快照文件,快照文件就类似于那一刻的一个截图。可以通过查看这个快照文件查看堆栈信息,死锁问题等。
除了堆栈之外,还可以对这个CPU和内存进行分析,也可以将此生成对应的快照。
在运行java的时候想测试内存的占用情况,这时候就需要用到测试工具。在eclipse里面有MAT插件可以测试,在idea中也有一个插件,就是JProfiler。相对于Visual VM,JProfiler这款工具相对而言更加强大,属于是非JDK自带的工具,因此需要进行付费才能使用。
JProfiler的功能强大,操作也比较友好,对被分析应用的影响小,对CPU,Thread,Memory分析功能强大,同时也支持jdbc,nosql,jsp,serverlet,socket等的操作,也支持监控本地和监控远程的操作。
通过这个JProfiler,可以有以下好处:
在本系列第9篇有讲解过这个JProfiler的安装教程,安装完这个插件之后,idea会显示在idea上面,https://blog.csdn.net/zhenghuishengq/article/details/130261481
我这边安装的是11的版本,其激活码为:S-J11-Everyone#553890-77gnvb3w8t9rd#4735
在idea插件中安装完以及本地安装完成之后,需要在这个session集成idea,选择对应安装的idea即可
在安装完毕之后,点击这个JProfiler这个按钮,就会出现以下的界面,并且控制台会打印一些JProfiler的东西,随后直接点击ok即可。
然后就会出现以下的画面,会实时的监控堆,CPU,线程,内存,类的总数,GC的时间点以及次数等等相关信息
接下来再模拟之前的那个死锁的程序
/**
* @author zhenghuisheng
* @date : 2023/5/12
*/
public class DeadBlockTest {
public static void main(String[] args) {
StringBuilder s1 = new StringBuilder();
StringBuilder s2= new StringBuilder();
new Thread(){
@Override
public void run() {
synchronized (s1){
s1.append("a");
s1.append("b");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s2){
s2.append("c");
s2.append("d");
}
}
}
}.start();
new Thread(){
@Override
public void run() {
synchronized (s2){
s1.append("a");
s1.append("b");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s1){
s2.append("c");
s2.append("d");
}
}
}
}.start();
}
}
其结果如下,会直接告知有两个线程死锁(真的强这个玩意)
里面还有很多功能,如通过图形以及图表查看内存泄漏的问题等等,可以安装JProfiler自行测试。
上面的这几款工具应对日常开发已经足够,接下来再聊一款阿里的开源开发工具Arthas(阿尔萨斯)。改款工具可以不需要通过远程连接,也不需要配置监控参数,就可以对这些数据进行监控。其官方文档如下:arthas.aliyun.com/zh-cn/
Arthas可以解决的问题如下:
其安装方式直接在浏览器输入该地址即可:https://alibaba.github.io/arthas/arthas-boot.jar ,等待片刻将其jar包下载即可,然后将下载的jar包传输到Linux服务器上,然后直接java -jar arthas-boot.jar
运行即可
arthas的基础的相关指令如下:
help: 查看帮助的指令
cat: 打印文件内容,和linux中的目录一样
echo: 打印参数,和linux里的tee相似
pwd: 返回当前目录
session: 查看当前回话信息
history: 打印历史命令
与jvm相关的指令如下:
dashboard: 当前系统的实时数据面板,可以加打印的总次数(-n)和间隔参数(-i)
thread: 查看当前JVM的线程堆栈信息
jvm: 查看当前JVM的信息
sysprop: 查看和修改JVM的系统属性
sysenv: 查看JVM的环境变量
getstatic: 查看类的静态属性
heapdump: 生成堆快照
与class和classLoader相关的信息
sc: 查看JVM已加载类的信息、
sm: 查看已加载类的方法的信息
jad: 反编译已加载类的源码
mc: .java编译成.class
redifine: 加载外部的.class文件
classloader:查看类的加载器信息
与方法指令相关的信息
monitor: 方法执行监控,如调用次数,执行时间,失败率等
watch: 方法执行数据监测,如异常,返回值,入参等
trace: 方法内部调用路径,输出方法上面每个结点的耗时
stack: 输出当前方法被调用的调用路径
在日常开发中,由于本人公司线上使用的是windows服务器,所以界面相对友好,在项目运行中更加的喜欢使用这个JProfiler工具,查看死锁,内存泄漏等问题,当然Arthas相对而言更加的适合在Linux服务器上使用。
除了这些可视化界面之外,还有如JMC、Flame Graphs、Btrace、YourKit、Jprobe、Spring Insight等等,都是可以使用的。
总而言之,没有最好的工具,只有最合适自己使用的开发工具。掌握Jconsole、JVisual VM,JProfiler 就基本能解决很多问题了,如果是线上出现很多疑难杂症,则可以再掌握一门Arthas。