如何利用VisualVM对高并发项目进行性能分析

发布时间:2021-11-09 17:36:50 作者:柒染
来源:亿速云 阅读:128

如何利用VisualVM对高并发项目进行性能分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

前面在学习JVM的知识的时候,一般都需要利用相关参数进行分析,而分析一般都需要用到一些分析的工具,因为一般使用IDEA,而VisualVM对于IDEA也不错,所以就选择VisualVM来分析JVM性能,这这里介绍一下如何利用VisualVM进行性能分析,以及在分析之前需要知道一些GC优化的原则,GC优化的目的,以及遇到问题时怎么去解决问题的方法。

1 为什么需要

开发大型 Java 应用程序的过程中难免遇到内存泄露、性能瓶颈等问题,比如文件、网络、数据库的连接未释放,未优化的算法等。随着应用程序的持续运行,可能会造成整个系统运行效率下降,严重的则会造成系统崩溃。为了找出程序中隐藏的这些问题,在项目开发后期往往会使用性能分析工具来对应用程序的性能进行分析和优化。

VisualVM 是一款免费的性能分析工具。它通过 jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多种方式从程序运行时获得实时数据,从而进行动态的性能分析。同时,它能自动选择更快更轻量级的技术尽量减少性能分析对应用程序造成的影响,提高性能分析的精度。

2 如何安装

这里有两种方式:

如果没有按照IDEA插件的话,我们需要找到JDK的按照目录bin下找到如下执行程序。

如何利用VisualVM对高并发项目进行性能分析

然后双击执行,就会出现界面,如下;

如何利用VisualVM对高并发项目进行性能分析

但是,我们一般使用IDEA,所以会使用插件,就是下面这种方式。

先在插件中找到VisualVM安装;

如何利用VisualVM对高并发项目进行性能分析

安装了之后,在运行的地方就会多出现两个VisualVM的运行按钮;

如何利用VisualVM对高并发项目进行性能分析

这样运行程序之后,就可以自动打开VisualVM程序了。

3 基本介绍

这一部分先对这个工具做一个简要的介绍,看看基本有哪些我们会用到的功能。

在没有添加其他插件的时候,是只有下面几个功能的。

如何利用VisualVM对高并发项目进行性能分析

3.1 概述

如何利用VisualVM对高并发项目进行性能分析

如上图所示,概述基本上都是我们的系统属性、运行程序时设置的JVM参数等信息的展示,所以,这一部分可以让我们查看这些信息。

3.2 监视

如何利用VisualVM对高并发项目进行性能分析

监视这个界面的功能还是很有作用的,可以看到cup运行情况、堆的使用情况、类的情况以及线程的动态情况。

因此,我们可以利用这个界面查看cpu情况好不好,更重要的是,我们可以查看堆的使用情况,这对于我们分析JVM还是非常重要的。

3.3 线程

如何利用VisualVM对高并发项目进行性能分析

如上图所以,可以看到所有的线程的情况,是运行、休眠、等待、驻留、监视等情况。

注意, 以上这些都不是关键,关键是VisualVM中还有一个很重要的功能,可以添加插件获取更多的功能。

3.4 插件添加

正是因为有了插件的扩展功能,所以这个工具才如此强大,VisualVM可以做到以下:

在工具->找到可用插件,安装即可。

如何利用VisualVM对高并发项目进行性能分析

下一部分我们就利用已经安装的插件Visual GC进行分析。

4 利用Visual GC分析虚拟机内存区域

这部分会用到一些Java虚拟机的一些基础知识,所以,查看这部分之前,请先查看这篇文章:。

如何利用VisualVM对高并发项目进行性能分析

在这个界面分为以下几个部分。

那么知道这些参数之后,怎么去分析虚拟机到底运行是好是坏呢,这个时候,我们需要了解一些Java虚拟机基础的优化知识。

首先,需要了解一些GC优化的原则。

另外,我们需要知道我们GC优化的目的。

一般,我们需要执行的有以下几点;

至于怎么算合适,后面我会通过一个实例讲解。

其实,如果想要知道更多JVM内存分配和回收策略的原理,可以查看这篇文章:JVM内存分配和回收策略的原理。

一般我们执行了我们的程序之后,接下来就是需要查看GC的状态了,接着分析结果,判断是否需要进行优化。

一般如果达到以下的指标,就不需要进行GC了。

实例 1

我们先看一个GC状态需要优化的例子,在这个实例中,我们给堆分配的最大最小的值都是64M(很小的堆大小)。

/**   * VM Args:-Xms64m -Xmx64m -XX:+HeapDumpOnOutOfMemoryError   * @author 欧阳思海   */  public class HeapTest {      static class StaticObject {      }      public static void main(String[] args) {          List<StaticObject> list = new ArrayList<StaticObject>();          int i = 1;          //不断的向堆中添加对象          while (true) {              list.add(new StaticObject());              i++;              System.out.println(i);              System.out.println(list.size());          }      }  }

如何利用VisualVM对高并发项目进行性能分析

由于分配的堆内存太小,所以导致,堆溢出。

接着我们查看一下Visual GC的监视情况。

如何利用VisualVM对高并发项目进行性能分析

我们可以从堆的使用情况看出,基本已经使用完。

如何利用VisualVM对高并发项目进行性能分析

从上图可知,在短短的运行时间中,Eden进行了49次GC,虽然时间短,但是能说明一个问题,新生代堆内存分配的空间太小,导致频繁GC。

同时,Old老年代也进行了33次GC,虽然运行时间也在不需要优化的范围内,而且从Survivor可以看出,基本没有GC,说明这些都是大对象,直接进入到了Old老年代,导致GC频繁。

所以,我们需要进行的优化就是加大新生代和老年代堆内存的大小,同时减少大对象的产生。

参数优化分析

我们将VM参数改为:-Xms512m -Xmx512m -Xmn128m -XX:+HeapDumpOnOutOfMemoryError,运行大概5分钟再次查看结果。

如何利用VisualVM对高并发项目进行性能分析

首先没有出现堆内存溢出。

如何利用VisualVM对高并发项目进行性能分析

加大了堆内存,所以堆内存没有出现问题。

如何利用VisualVM对高并发项目进行性能分析

加大了堆内存之后,Eden新生代进行了66次GC,使用时间3.381s基本满足要求(执行时间不到50ms,Minor GC执行不频繁,约10秒一次),同时老年代old进行了2次GC,使用时间4.127s,这里还是有待优化的,不太满足优化要求。

如何利用VisualVM对高并发项目进行性能分析

点击堆 dump这个按钮就会生成 dump文件,我们可以分析类及对象的一些情况。

如何利用VisualVM对高并发项目进行性能分析

分析之后发现,StaticObject对象大多,没有进行GC,问题主要在这里,所以,下一步需要解决这个问题。

通过以上分析可以说明一个问题,加大了堆内存之后,新生代和老年代的GC情况大大的改善了,但是还有大对象的问题,所以还有待优化。

修改程序,如下:

/**   * VM Args:-Xms512m -Xmx512m -Xmn128m -XX:+HeapDumpOnOutOfMemoryError   *   * @author 欧阳思海   */  public class HeapTest {     /* static class StaticObject {      }*/      public static void main(String[] args) {          int i = 1;          while (true) {              i++;              System.out.println(i);          }      }  }

如何利用VisualVM对高并发项目进行性能分析

堆一直运行良好。

如何利用VisualVM对高并发项目进行性能分析

这次相对于上次相比,老年代的情况已经改善了,没有GC,说明大对象不存在了。

通过上面的分析跟优化,就满足GC的需求了,不需要再优化了。

看完上述内容,你们掌握如何利用VisualVM对高并发项目进行性能分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

推荐阅读:
  1. 使用VisualVM分析高并发项目性能的方法
  2. 怎么对vue项目进行打包

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

visualvm

上一篇:如何分析Java高可用集群架构与微服务架构

下一篇:Django中的unittest应用是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》