Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻。

好的分析工具能起到事半功倍的效果,利用分析利器JMC、JFR,可以实现性能问题的准确定位。

本文主要阐述如何利用JMC分析系统性能

JMC:Java Mission Control

JFR:Java Flight Recorder

JMC:Java Mission Control

JMC打开性能日志后,主要包括7部分性能报告,分别是一般信息、内存、代码、线程、I/O、系统、事件。其中,内存、代码、线程及I/O是系统分析的主要部分,本文会重点进行阐述。

启动JMC后,连接某个本地应用后,出现如下界面:

远程连接JVM(通过JMX连接如果想要用jmc监控远程的JVM进程,配置方式和jvisualvm方式一一样即可)

本地连接比较简单这里就不在赘述,远程连接JVM,我在这里利用VMWare工具进行模拟,过程中遇到一些问题,值得注意的。

远程机器环境: 
1. IP:192.168.91.129 
2. Java版本:SE 8u92 
3. 系统版本:openSUSE Leap 42.1 (x86_64)

首先,远程机器被监控的程序需要开启调试端口,在执行java命令行中加入以下属性,属性没有以ssl安全认证方式连接的,案例中启动监听端口为7091

-Dcom.sun.management.jmxremote.port=7091
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

然后,启动JMC客户端->“新建连接”->输入远程机器IP和port->点击“完成”即可。

启动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过高导致的性能问题。

Java性能调优:利用JMC分析性能的更多相关文章

  1. [Spark性能调优] 第一章:性能调优的本质、Spark资源使用原理和调优要点分析

    本課主題 大数据性能调优的本质 Spark 性能调优要点分析 Spark 资源使用原理流程 Spark 资源调优最佳实战 Spark 更高性能的算子 引言 我们谈大数据性能调优,到底在谈什么,它的本质 ...

  2. spark 性能调优(一) 性能调优的本质、spark资源使用原理、调优要点分析

    转载:http://www.cnblogs.com/jcchoiling/p/6440709.html 一.大数据性能调优的本质 编程的时候发现一个惊人的规律,软件是不存在的!所有编程高手级别的人无论 ...

  3. JVM性能调优2:JVM性能调优参数整理

    序号 参数名 说明 JDK 默认值 使用过 1 JVM执行模式 2 -client-server 设置该JVM运行与Client 或者Server Hotspot模式,这两种模式从本质上来说是在JVM ...

  4. JVM性能调优(4) —— 性能调优工具

    前序文章: JVM性能调优(1) -- JVM内存模型和类加载运行机制 JVM性能调优(2) -- 垃圾回收器和回收策略 JVM性能调优(3) -- 内存分配和垃圾回收调优 一.JDK工具 先来看看有 ...

  5. [性能调优]PeopleSoft Trace 分析工具 - TraceMagic

    PeopleSoft Trace 文件包含大量的信息,在前面文章讲解过如何查看trace日志文件,这边文章介绍一个工具可以很好的分析trace日志文件. TraceMagic 是由oracle开发的一 ...

  6. MySql(九):MySQL性能调优——Schema设计的性能优化

    一.高效的模型设计 先了解下数据库设计的三大范式 第一范式:要求有主键,并且要求每一个字段原子性不可再分 第二范式:要求所有非主键字段完全依赖主键,不能产生部分依赖 第三范式:所有非主键字段和主键字段 ...

  7. 性能调优之Java系统级性能监控及优化

    性能调优之Java系统级性能监控及优化   对于性能调优而言,通常我们需要经过以下三个步骤:1,性能监控:2,性能剖析:3,性能调优 性能调优:通过分析影响Application性能问题根源,进行优化 ...

  8. 成为Java GC专家(5)—Java性能调优原则

    并不是每个程序都需要调优.如果一个程序性能表现和预期一样,你不必付出额外的精力去提高它的性能.然而,在程序调试完成之后,很难马上就满足它的性能需求,于是就有了调优这项工作.无论哪种编程语言,对应用程序 ...

  9. 性能调优的本质、Spark资源使用原理和调优要点分析

    本课主题 大数据性能调优的本质 Spark 性能调优要点分析 Spark 资源使用原理流程 Spark 资源调优最佳实战 Spark 更高性能的算子 引言 我们谈大数据性能调优,到底在谈什么,它的本质 ...

随机推荐

  1. django CBV和FBV写法总结

    一.FBV function base views 平常我们的写法,一个URL对应一个视图函数 二.CBV 1.url 配置 path('test/',views.CBVTest.as_views() ...

  2. hdu2328 Corporate Identity 扩展KMP

    Beside other services, ACM helps companies to clearly state their “corporate identity”, which includ ...

  3. 【BZOJ1497】【NOI2006】最大获利

    最小割好劲啊 原题: 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项 ...

  4. 01 Linux简介

    1.Linux简介 UNIX与Linux发展史 Unix在1969年,美国贝尔实验室的肯汤普森在DEC PDP-7机器上开发出了UNIX系统. Linux出现于1991年,是由芬兰赫尔辛基大学学生李纳 ...

  5. 2D Platformer 学习

    using UnityEngine; using System.Collections; /// <summary> /// 玩家控制 /// </summary> publi ...

  6. Sql server日期函数用法

    SQL日期函数 SQL日期函数中的类型码可以为0,1,2,3,4,5,6,7,8,9,10,11,12,13,14 ,20,21,22,23,24,25,100,101,102,103,104,105 ...

  7. 重写( override)and 重载(overload)

    重写override:是子类对父类的允许访问的方法的实现过程的重新编写,名字,返回值和形参都不能改变,即外壳不变,内心更改 重载overload:同一个类里面的方法,名字相同而参数不同,返回值可以相同 ...

  8. SimpleEntity

    项目地址 :  https://github.com/kelin-xycs/SimpleEntity SimpleEntity 一个 用 C# 实现的 简单的 持久层 Entity 实现 . 这是一个 ...

  9. pri 知识点

    pri github:https://github.com/prijs/pri 添加路由后动态导入,使用的是 react-loadable:https://github.com/jamiebuilds ...

  10. 代码风格统一工具:EditorConfig 和 静态代码检查工具:ESLint

    EditorConfig 最常见的用途是:统一文件的编码字符集以及缩进风格 使用 Eslint 做代码 lint,那么为什么还要使用 .editorconfig 呢?细细想了下,应该有两个方面吧. E ...