专栏首页朝雨忆轻尘Java性能调优:利用JMC进行性能分析

Java性能调优:利用JMC进行性能分析

JMC, 即Java任务控制(Java Mission Control)是从Java7(7u40)和 Java8 的商业版本包括一项新的监控和控制特性。

JMC 程序 (JDK_HOME\bin目录下) 会启动一个窗口程序,然后让我们选择对那进程进行监控,JMC打开性能日志后,

主要包括7部分性能报告,分别是一般信息、内存、代码、线程、I/O、系统、事件。其中,内存、代码、线程及I/O是系统分析的主要部分。

启动JMC,打开生成的JFR性能日志

1. 一般信息,如下图所示

图中, 堆使用量、CPU总体占用率、GC暂停时间是非常重要的三个指标

对于Java应用而言,GC暂停时间是最值得关注的指标。

2. 内存信息

2.1 通过内存信息,我们可以清晰的看到垃圾收集器的类型,垃圾收集的暂停时间,包括最短暂停时间、平均暂停时间、最长暂停时间,

以及更为重要的垃圾收集频率(垃圾收集的周期及STW时长)。

2.2 垃圾收集

垃圾收集的详细报告,详细描述了堆的回收信息,垃圾收集过程中的异常事件,此处不一一详述。

2.3 GC时间

详细描述GC时间相关的信息

2.4 GC配置

详细列出垃圾收集过程中,GC的配置信息,主要包括年轻代、老年代的GC类型,GC过程中的CPU状态及GC时间比率

3. 代码分析

 代码分析是Java性能分析重点,通过代码分析,我们可以清楚的知道系统运行时,哪些类及方法被高频率的调用

3.1 热点方法

通过查看热点方法调用栈,我们可以清晰的了解到系统的主要计算资源消耗情况。

我们举例说明,如上图中的ConcurrentHashMap的containKey方法及get方法,而两个方法都会执行计算hashcode的功能。当我们的应用出现先判断containKey,然后执行get方法时,我们可以省略containKey,这样可以省略一次hashcode的计算,可以节约计算资源。

3.2 调用树

通过调用树,我们能以模块化的方式直观的看到系统运行状态。

通过上图,我们得知99.9%的热点方法是运行程序,这非常符合我们的预期,大家可以逐层展开方法,详细分析方法。例如:在本例中,我们发现List与Map之间的性能差异非常大,同样数量级的执行次数,List性能相较于Map就很差,这也符合我们的认知范围。

4. 线程

 通过线程概述报告,我们可以得知CPU占用率的分布(系统占用率、应用程序+JVM占用率)和活动线程数,对于CPU占用率而言,应用程序应该占用99%的计算资源,而活动线程数应该控制在合理范围内(具体看应用)。

4.1 热点线程

热点线程一栏,详细列出了热点线程的数量及详情,通过详情,我们可以得知线程的执行情况。  4.2 线程争用

 线程争用是解决应用性能最为关键的部分,在应用上线初期,我们可以通过解决线程争用初步实现系统性能的巨大提升。上图中的争用为GC导致,具体是由于使用G1时,设置的GC预期暂停时间过短导致的。

系统性能分析初期,我们可以首先定位线程争用的情况,可以初步达到性能的飞跃。

5. IO

 IO作为系统的基础指标,IO过高会导致系统性能急剧下降,避免过度打印日志和生成大文件可以避免系统IO过高导致的性能问题。

本文转载自

  • 原文作者:h254532699的博客
  • 原文链接:https://blog.csdn.net/h254532699/article/details/54342511

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java并发编程:Java中的锁和线程同步机制

    乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更...

    朝雨忆轻尘
  • Java并发编程:Java实现多线程的几种方式

    在Java中,多线程主要的实现方式有四种:继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread...

    朝雨忆轻尘
  • Vue笔记:使用 axios 发送请求

    在Vue1.0的时候有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource...

    朝雨忆轻尘
  • 多线程入门

    HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE...

    用户1624346
  • 进程、线程、协程

    直白地讲,进程就是应用程序的启动实例。比如我们运行一个游戏,打开一个软件,就是开启了一个进程。

    IT茂茂
  • Rust入坑指南:齐头并进(上)

    我们知道,如今CPU的计算能力已经非常强大,其速度比内存要高出许多个数量级。为了充分利用CPU资源,多数编程语言都提供了并发编程的能力,Rust也不例外。<!-...

    Jackeyzhe
  • Thrift 服务器端的几种工作模式分析

    相关示例代码见:http://download.csdn.net/detail/hjx_1000/8374829

    bear_fish
  • 一篇文章搞懂Python多线程简单实现和GIL

    今天开始打算开一个新系列,就是python的多线程和多进程实现,这部分可能有些新手还是比较模糊的,都知道python中的多线程是假的,但是又不知道怎么回事,首先...

    南山烟雨
  • 通过了解RejectedExecutionException来分析ThreadPoolExecutor源码

    观看本文章之前,最好看一下这篇文章熟悉下ThreadPoolExecutor基础知识。 1.关于Java多线程的一些常考知识点 2.看ThreadPoolE...

    用户2032165
  • Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理

    execute()是 java.util.concurrent.Executor接口中唯一的方法,JDK注释中的描述是“在未来的某一时刻执行命令command”...

    Janti

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动