深入理解Java虚拟机——如何使用VisualVM对高并发项目进行性能分析一般用IDEA,IDEA用VisualVM也不错,所以选择VisualVM分析JVM性能。本文介绍如何使用VisualVM进行性能分析,分析前需要了解GC优化的一些原则,以及GC优化的目的。以及遇到问题时如何解决。1为什么需要开发大型Java应用程序?在开发大型Java应用的过程中,难免会遇到文件、网络、数据库连接未释放,算法未优化等内存泄漏和性能瓶颈等问题。随着应用程序的持续运行,可能会导致整个系统的运行效率下降,严重时可能导致系统崩溃。为了发现程序中隐藏的这些问题,在项目开发的后期往往会使用性能分析工具对应用程序的性能进行分析和优化。VisualVM是一款免费的性能分析工具。它通过jvmstat、JMX、SA(ServiceabilityAgent)、AttachAPI等多种方式从程序运行时获取实时数据,进行动态性能分析。同时,它可以自动选择更快、更轻的技术,最大限度地减少性能分析对应用程序的影响,提高性能分析的准确性。2如何安装有两种方式:不带IDEA插件如果不带IDEA插件,我们需要找到JDK,在bin目录下找到如下执行程序。然后双击执行,出现界面,如下;但是我们一般都是用IDEA,所以会用到插件,也就是下面的方法。根据IDEA插件,首先在插件中找到VisualVM安装;安装完成后,运行处会多出现两个VisualVM运行按钮;这样运行程序后,VisualVM程序就可以自动打开了。3基本介绍这部分首先对这个工具做一个简单的介绍,并看到我们将要使用的基本功能。在不添加其他插件的情况下,只有以下功能。3.1Overview如上图所示,Overview基本上是对我们的系统属性,运行程序时设置的JVM参数等信息的展示,所以这部分可以让我们查看这些信息。3.2监控这个接口的监控功能还是很有用的。可以看到cup的运行状态,heap的使用情况,class的状态,线程的动态。因此,我们可以通过这个接口来查看cpu是否良好,更重要的是可以查看heap的使用情况,这对于我们分析JVM来说非常重要。3.3线程如上图所示,可以看到所有线程的状态,如running、sleeping、waiting、resident、monitoring等,注意以上都不是critical。关键是VisualVM还有一个很重要的功能,就是可以通过添加插件来获得更多的功能。3.4添加插件正是因为插件的扩展功能,这个工具才如此强大。VisualVM可以做以下事情:显示虚拟机进程和进程配置、环境信息、jps、jinfo。监控应用程序的cpu、GC、heap、方法区和线程信息(jstat、jstack)。转储和分析堆存储快照(jmap、jhat)。还有很多其他功能。在Tools->Installthem中找到可用的插件。在接下来的部分中,我们将使用安装的插件VisualGC进行分析。4使用VisualGC分析虚拟机内存区域这部分会用到Java虚拟机的一些基础知识,所以在看这部分之前,请先看看这篇文章:。该界面分为以下几个部分。space(Metaspace(元数据),Oldage,newgeneration(Eden,S0,S1))Graphs(CompileTime(编译时间),ClassLoaderTime(类加载时间),GCTime(垃圾收集时间),EdenSpace,Survivor0,Survivor1,OldGen,Metaspace)Histogram(Parameters参数设置)知道这些参数后,如何分析虚拟机是否运行良好?这时候,我们就需要了解一些Java虚拟机优化的基本知识。首先,你需要了解GC优化的一些原则。大多数Java应用程序不需要在服务器上进行GC优化;大多数导致GC问题的Java应用不是参数设置错误导致的,而是代码问题;应用上线前,考虑将机器的JVM参数设置为最优(Mostsuitable);减少创建对象的数量;减少全局变量和大对象的使用;GC优化是最后的手段;在实际使用中,分析GC条件来优化代码远不止优化GC参数那么简单;另外,我们需要知道我们GC优化的目的。尽量减少转移到老年代的对象数量;减少fullGC的执行时间;一般来说,我们需要实现以下几点;减少全局变量和大对象的使用;将新生代??的大小调整到最合适;设置老年代的大小是最合适的;选择合适的GC收集器;至于如何计算出合适的尺寸,后面会通过例子来说明。其实如果你想了解更多关于JVM内存分配和回收策略的原理,可以看看这篇文章:JVM内存分配和回收策略原理。一般我们执行完自己的程序之后,接下来就是查看GC的状态,然后分析结果来判断是否需要优化。一般满足以下指标,就不需要GC了。MinorGC执行时间小于50ms,MinorGC执行不频繁,大约10秒一次;FullGC执行时间小于1s,FullGC执行频率不频繁,不少于10分钟一次;Example1先来看一个GC需要优化state的例子。在这个例子中,我们分配给堆的最大值和最小值都是64M(一个小的堆大小)。GC状态分析/***VMArgs:-Xms64m-Xmx64m-XX:+HeapDumpOnOutOfMemoryError*@author欧阳思海*/publicclassHeapTest{staticclassStaticObject{}publicstaticvoidmain(String[]args){List
