`
SIHAIloveYAN
  • 浏览: 119334 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

深入理解Java虚拟机-如何利用VisualVM对高并发项目进行性能分析

    博客分类:
  • java
阅读更多

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

1 为什么需要

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

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

2 如何安装

这里有两种方式:

  • 没有按照IDEA插件

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

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

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

  • 按照IDEA插件

先在插件中找到VisualVM安装;

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

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

3 基本介绍

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

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

3.1 概述

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

3.2 监视

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

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

3.3 线程

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

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

3.4 插件添加

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

  • 显示虚拟机进程以及进程的配置、环境信息、jps、jinfo。
  • 监视应用程序的cpu、GC、堆、方法区以及线程的信息(jstat、jstack)。
  • dump以及分析堆转存储快照(jmap、jhat)。
  • 还有很多其他的功能。

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

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

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

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

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

  • space(Metaspace(元数据)、Old老年代、新生代(Eden、S0、S1))
  • Graphs(Compile Time(编译时间)、Class Loader Time(类加载时间)、GC Time(垃圾收集时间)、Eden Space、Survivor 0、Survivor 1、Old Gen、Metaspace)
  • Histogram(Parameters参数设置)

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

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

  • 多数的Java应用不需要在服务器上进行GC优化;
  • 多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题;
  • 在应用上线之前,先考虑将机器的JVM参数设置到最优(最适合);
  • 减少创建对象的数量;
  • 减少使用全局变量和大对象;
  • GC优化是到最后不得已才采用的手段;
  • 在实际使用中,分析GC情况优化代码比优化GC参数要多得多;

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

  • 将转移到老年代的对象数量降低到最小;
  • 减少full GC的执行时间;

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

  • 减少使用全局变量和大对象;
  • 调整新生代的大小到最合适;
  • 设置老年代的大小为最合适;
  • 选择合适的GC收集器;

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

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

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

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

  • Minor GC执行时间不到50msMinor GC执行不频繁,约10秒一次;
  • Full GC执行时间不到1sFull GC执行频率不算频繁,不低于10分钟1次;

实例 1

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

GC状态差情况分析
 1/**
 2 * VM Args:-Xms64m -Xmx64m -XX:+HeapDumpOnOutOfMemoryError
 3 * @author 欧阳思海
 4 */
 5public class HeapTest {
 6
 7    static class StaticObject {
 8    }
 9
10    public static void main(String[] args) {
11        List<StaticObject> list = new ArrayList<StaticObject>();
12        int i = 1;
13
14        //不断的向堆中添加对象
15        while (true) {
16            list.add(new StaticObject());
17            i++;
18            System.out.println(i);
19            System.out.println(list.size());
20        }
21    }
22}

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

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

  • 监视界面情况

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

  • Visual GC监视情况

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

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

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

参数优化分析

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

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

  • 监视情况

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

  • Visual GC监视情况

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

  • dump文件分析

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

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

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

修改大对象,进行GC

修改程序,如下:

 1/**
 2 * VM Args:-Xms512m -Xmx512m -Xmn128m -XX:+HeapDumpOnOutOfMemoryError
 3 *
 4 * @author 欧阳思海
 5 */
 6public class HeapTest {
 7
 8   /* static class StaticObject {
 9    }*/
10
11    public static void main(String[] args) {
12        int i = 1;
13
14        while (true) {
15            i++;
16            System.out.println(i);
17        }
18
19    }
20}
  • 监视情况

堆一直运行良好。

  • Visual GC监视情况

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

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

Java虚拟机深入理解系列全部文章更新中…

5 总结

通过上面的分析及使用,VisualVM基本的使用以及如何利用VisualVM进行Java虚拟机优化相信你已经掌握了,如果还想了解更过关于Java虚拟机的知识及优化文章,请看本系列的其他文章。

1、原创不易,老铁,文章需要你的 点赞 让更多的人看到,希望能够帮助到大家!

2、文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号好好学java,公众号已有 6W 粉丝,回复:1024,获取公众号的大礼包,公众号长期发布 Java 优质系列文章,关注我们一定会让你收获很多!

0
1
分享到:
评论

相关推荐

    深入java虚拟机 高清pdf 高清高清高清

    《深入Java虚拟机》这本书是Java开发者深入了解JVM(Java Virtual Machine)的必备经典之作。它详尽地探讨了Java虚拟机的工作原理、内存管理、类加载机制、字节码执行以及性能优化等多个核心主题,旨在帮助开发者...

    精品:java虚拟机分析与优化PPT

    ### Java虚拟机分析与优化关键知识点 #### 一、Java虚拟机基础知识 1. **Java虚拟机(JVM)概述** - Java是一种面向对象的编程语言,具有“一次编写,到处运行”的特点。 - Java代码通过编译器转换为字节码,由...

    java虚拟机_JVM高级特性与实践最新版

    《深入理解Java虚拟机_JVM高级特性与最佳实践 第2版》是一本专注于Java开发者深入探索JVM(Java Virtual Machine)的重要参考资料。本书全面讲解了Java虚拟机的内部工作机制,涵盖了JVM的高级特性和最佳实践,旨在...

    深入java虚拟机

    《深入理解Java虚拟机:JVM高级特性与最佳实践》是一部经典的Java技术书籍,它全面地探讨了Java虚拟机(JVM)的工作原理及其优化策略。本书主要涵盖了以下几个核心知识点: 1. **JVM架构**:Java虚拟机是Java程序...

    com-sun-tools-visualvm-modules-visualgc.rar

    在Java开发中,对JVM(Java虚拟机)的性能监控是至关重要的,特别是在处理大型应用或高并发场景时。VisualGC插件作为一款强大的工具,它为我们提供了直观、详尽的JVM内存使用情况的监控功能,帮助开发者定位内存泄漏...

    java虚拟机调优--某培训班的课件与源码

    本资源"java虚拟机调优--某培训班的课件与源码"提供了一套全面的培训材料,旨在帮助开发者深入理解和优化JVM的工作机制。 在Java开发中,JVM调优是一项至关重要的技能,它可以显著提高应用的性能,减少内存占用,...

    java深度历险+深入java虚拟机

    《Java深度历险》与《深入Java虚拟机》是两本深受Java开发者喜爱的经典书籍,它们涵盖了Java编程语言和Java虚拟机(JVM)的高级主题,旨在帮助读者深入理解Java平台的工作原理。 《Java深度历险》这本书通常会涵盖...

    深入java虚拟机源码

    《深入Java虚拟机源码》一书主要涵盖了Java虚拟机(JVM)的内部工作原理,...通过对这些章节的学习,读者将能够深入理解Java虚拟机的工作原理,更好地进行性能优化和问题定位,从而提升Java应用程序的稳定性和效率。

    UnderstandingTheJvm:《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第二版)》书中的示例代码,供学习使用

    《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第二版)》是一本深受Java开发者欢迎的书籍,它详细解析了Java虚拟机(JVM)的工作原理、内存管理、性能优化等多个关键领域。UnderstandingTheJvm项目是这本书的配套...

    深入理解_Java_虚拟机_(JVM_高级特性与最佳实践

    《深入理解Java虚拟机》是一本专为Java程序员量身打造的深度解析JVM的书籍。Java虚拟机(Java Virtual Machine,简称JVM)是Java平台的核心组成部分,它负责执行Java程序,是Java语言跨平台特性的基石。本书旨在帮助...

    实战JAVA虚拟机 JVM故障诊断与性能优化.rar

    通过对JVM内部机制的深入理解,我们可以更有效地调试、诊断和优化Java应用程序。 一、JVM概述 Java虚拟机是Java平台的核心组成部分,它负责执行字节码,并提供了内存管理、垃圾回收等服务。理解JVM的工作原理对于...

    深入Java虚拟机(第二版)

    最后,书中提供了大量实战案例和工具使用技巧,如使用JConsole、VisualVM等工具进行性能分析和调优。这些实用技能可以帮助开发者在实际工作中解决各种问题,提升应用性能。 总之,《深入Java虚拟机(第二版)》是一...

    java虚拟机精讲pdf

    高翔龙编著的《java虚拟机精讲》是一本面向已有一定Java基础的开发者的深度学习资料,旨在帮助读者深入理解JVM的工作原理及其在实际开发中的应用。 首先,我们需要了解JVM的主要结构和组件。JVM包括类装载器、运行...

    深入Java虚拟机 JVM pdf

    《深入Java虚拟机》是Java开发者必读的经典之作,它详细阐述了Java虚拟机(JVM)的工作原理和内部机制,对于理解Java程序的运行方式、优化代码性能以及排查问题具有极其重要的价值。这本书的第二版更是加入了更多...

    Java虚拟机资料(5个文件)

    - "深入理解Java虚拟机JVM高级特性与最佳实践.pdf"可能会涵盖上述的JVM高级特性,提供实际案例和优化建议。 - "JVM系列之-了解Java与Java虚拟机@看过.pptx"和"JVM系列之-JVM内存结构@看完.pptx"可能作为系列教程,...

    深入JAVA虚拟机第二版

    6. **性能调优**:学习如何通过JVM提供的各种工具进行性能分析和调优,例如JConsole、VisualVM等,以及如何通过JMX进行远程监控和管理。 7. **异常处理与线程**:了解JVM如何处理异常,以及线程的创建、同步、调度...

    深入JAVA虚拟机原代码

    8. **类文件结构**:深入理解`.class`文件的结构,如魔数、版本号、常量池、字段表、方法表等,有助于我们分析和处理字节码级别的问题。 9. **安全机制**:JVM提供了一套安全模型,包括类加载的安全检查、权限管理...

    深入java虚拟机第二版

    《深入Java虚拟机第二版》是一本专门为Java开发者和爱好者准备的深度技术指南,它全面地探讨了Java虚拟机(JVM)的工作原理及其优化策略。这本书深入剖析了JVM的内部机制,包括类加载、内存管理、垃圾回收、字节码...

    java虚拟机源码-jvm-v3:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)

    通过对这些知识点的深入理解和实践,开发者可以更好地驾驭Java虚拟机,提升程序的运行效率,解决性能问题,实现更高质量的软件开发。同时,结合开源的JVM源码,可以进一步探索和优化Java平台的运行机制。

Global site tag (gtag.js) - Google Analytics