美文网首页JVM
(转)Java性能调优:JMC性能分析

(转)Java性能调优:JMC性能分析

作者: _王子_ | 来源:发表于2019-08-15 17:45 被阅读0次

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

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

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

    • JMC:Java Mission Control
    • JFR:Java Flight Recorder

    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->点击“完成”即可。

    image

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

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

    image

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

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

    2. 内存信息

    image

    2.1 通过内存信息,我们可以清晰的看到垃圾收集器的类型,垃圾收集的暂停时间,包括最短暂停时间、平均暂停时间、最长暂停时间,以及更为重要的垃圾收集频率(垃圾收集的周期及STW时长)。

    2.2 垃圾收集

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

    2.3 GC时间

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

    2.4 GC配置

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

    3. 代码分析


    image

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

    3.1 热点方法

    image

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

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

    3.2 调用树

    image

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

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

    4. 线程

    image

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

    4.1 热点线程

    image

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

    image

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

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

    5. IO

    image

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

    相关文章

      网友评论

        本文标题:(转)Java性能调优:JMC性能分析

        本文链接:https://www.haomeiwen.com/subject/ylnzjctx.html