JVM性能监控与调优篇


1 概述

1.1 性能优化步骤

1.1.1 第一步-性能监控

一种以非强行或者入侵方式收集或查看应用运营性能数据的活动。
监控通常是指一种在生产、质量评估或者开发环境下实施的带有预防或主动性的活动。
当应用相关干系人提出性能问题却没有提供足够多的线索时,首先我们需要进行性能监控,随后是性能分析。

1.1.2 第二步-性能分析

一种以侵入方式收集运行性能数据的活动,它会影响应用的吞吐量或响应性。
性能分析是针对性能问题的答复结果,关注的范围通常比性能监控更加集中。
性能分析很少在生产环境下进行,通常是在质量评估、系统测试或者开发环境下进行,是性能监控之后的步骤。

1.1.3 第三步-性能优化

一种为改善应用响应性或吞吐量而更改参数、源代码、属性配置的活动,性能调优是在性能监控、性能分析之后的活动。

1.2 性能指标

1.2.1 停顿时间(或响应时间)

提交请求和返回该请求的响应之间使用的时间,一般比较关注平均响应时间
常用操作的响应时间列表:

在垃圾回收环节中:
暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间。
-XX:MaxGCPauseMillis 用于设置JVM垃圾回收中最大的暂停时间(STW:stop the world)

1.2.2 吞吐量

见概览

1.2.3 并发数

1000个人同时在线,估计并发数在5%-15%之间,也就是同时并发量:50 - 150之间。

1.2.4 内存占用

主要是堆空间占用多,元空间占少数

1.2.5 相互间的关系

以高速公路同行状况为例
吞吐量:每天通过高速公路收费站的车辆的数据(也可以理解为收费站收取的高速费)
并发数:高速公路上正在行驶的车辆的数目
响应时间:车速

2 JVM监控及诊断工具-命令行篇

2.1 概述

性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。

Java作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成Java应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/0、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。

体会1:使用数据说明问题,使用知识分析问题,使用工具处理问题。

体会2:无监控、不调优!

2.1.1 简单命令行工具

在我们刚接触java学习的时候,大家肯定最先了解的两个命令就是javac,java,那么除此之外,还有没有其他的命令可以供我们使用呢?我们进入到安装jdk的bin目录,发现还有一系列辅助工具。这些辅助工具用来获取目标JVM 不同方面、不同层次的信息,帮助开发人员很好地解决Java应用程序的一些疑难杂症。

2.2 jps:查看正在运行的Java进程

2.2.1 基本情况

jps( Java Process status):
显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程。
说明:对于本地虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的,是唯一的。

2.2.2 测试


10024:ScannerTest是测试的程序
6828:jps自身进程,再次输入jps命令,进程id变了,说明jps在执行完后会终止进程,再次打开,重新开启进程
13260:虚拟机自身进程

2.2.3 基本语法

jps [-help]
jps [-q] [-mlvV] []
options参数
-q:仅仅显示LVMID (local virtual machine id),即本地虚拟机唯一id。不显示主类的名称等
-1:输出应用程序主类的全类名或如果进程执行的是jar包,则输出jar完整路径
-m:输出虚拟机进程启动时传递给主类main()的参数
-v:列出虚拟机进程启动时的JVM参数。比如: -Xms20m -Xm×5em是启动程序指定的jvm参数。
说明:以上参数可以综合使用。
补充:
如果某Java进程关闭了默认开启的UsePerfData参数(即使用参数
-XX:-UsePerfData),那么jps命令(以及下面介绍的jstat)将无法探知该Java进程。

2.2.3.1 jps -q

2.2.3.2 jps -l

2.2.3.3 jps -m

2.2.3.3 jps -v

2.2.3.4 补充演示

在idea VM option 中加入参数

加入-UserPerData后,该进程不显示

改为+UserPerData后显示,默认显示

JVM