JVM 调优篇5 jvm性能监控
一 jvm性能监控
1.1 概述
性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。
体会1:使用数据说明问题,使用知识分析问题,使用工具处理问题。
体会2:无监控、不调优!
调优工具:
1.2 总结信息*
jstat用于监视虚拟机的统计信息,jstack用于生成线程堆栈快照,而jmap用于生成堆转储文件,每个工具都有其特定的用途和作用范围。
二 性能调优常用命令
2.1 jps查看正在运行的java进程
显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程。
-q :仅仅显示LVMID (local virtual machine id),即本地虚拟机唯一id。不显示主类的名称等
-l: 输出应用程序主类的全类名 或 如果进程执行的是jar包,则输出jar完整路径
-m: 输出虚拟机进程启动时传递给主类main()的参数
-v: 列出虚拟机进程启动时的JVM参数。 比如:-Xms20m -Xmx50m是启动程序指定的jvm参数。
说明:以上参数可以综合使用。
2.2 jstat 查看jvm的堆统计信息*
2.2.1 作用
用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。常用于检测垃圾回收问题以及内存泄漏问题。
它的基本使用语法为:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
案例:jstat -gc 1000 5 #每1秒更新一下,一共显示5条
相关参数:
选项option可以由以下值构成。
1)类装载相关的:
-class:显示ClassLoader的相关信息:类的装载、卸载数量、总空间、类装载所消耗的时间等。
2)垃圾回收相关的:查看命令相关参数:jstat -h 或 jstat -help
-gc:显示与GC相关的堆信息。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息。
-gccapacity:显示内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间。
-gcutil:显示内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。
-gccause:与-gcutil功能一样,但是会额外输出导致最后一次或当前正在发生的GC产生的原因。
-gcnew:显示新生代GC状况
-gcnewcapacity:显示内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间
-geold:显示老年代GC状况
-gcoldcapacity:显示内容与-gcold基本相同,输出主要关注使用到的最大、最小空间
-gcpermcapacity:显示永久代使用到的最大、最小空间。
2.2.2 案例
jstat还可以用来判断是否出现内存泄漏。
第1步:
在长时间运行的 Java 程序中,我们可以运行jstat命令连续获取多行性能数据,并取这几行数据中OU列(即已占用的老年代内存)的最小值。
第2步:
然后,我们每隔一段较长的时间重复一次上述操作,来获得多组OU最小值。如果这些值呈上涨趋势,则说明该 Java 程序的老年代内存已使用量在不断上涨,这意味着无法回收的对象在不断增加,因此很有可能存在内存泄漏。
命令: jstat -gc pid 1000 10
具体参数说明:
2.3 jinfo查看和修改jvm的参数信息*
jinfo(Configuration Info for Java)
查看虚拟机配置参数信息,也可用于调整虚拟机的配置参数。
它的基本使用语法为:
jinfo [ options ] pid
说明:java 进程ID 必须要加上
参数说明:
案例说明:
2.4 jmap生成堆转储快照文件
2.4.1 功能作用
jmap(JVM Memory Map):作用一方面是获取dump文件(堆转储快照文件,二进制文件),它还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息、类加载信息等。
一般来说,使用jmap指令生成dump文件的操作算得上是最常用的jmap命令之一,将堆中所有存活对象导出至一个文件之中。
注意说明:
1. 通常在写Heap Dump文件前会触发一次Full GC,所以heap dump文件里保存的都是FullGC后留下的对象信息。
2. 由于生成dump文件比较耗时,因此大家需要耐心等待,尤其是大内存镜像生成dump文件则需要耗费更长的时间来完成。
2.4.2 生成堆文件两种方式*
命令:
自动方式: jmap -dump:format= b,file=<filename.hprof><pid>
手动方式: -XX: +heapDumpOnOutOfMemoryError
2.4.3 jamp常用参数配置
2.5 jstack 查看线程堆快照
2.5.1 作用
jstack(JVM Stack Trace):用于生成虚拟机指定进程当前时刻的线程快照(虚拟机堆栈跟踪)。
生成线程快照的作用:可用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。这些都是导致线程长时间停顿的常见原因。当线程出现停顿时,就可以用jstack显示各个线程调用的堆栈情况。
2.5.2 重点关注事项
在thread dump中,要留意下面几种状态:
死锁,Deadlock(重点关注)
等待资源,Waiting on condition(重点关注)
等待获取监视器,Waiting on monitor entry(重点关注)
阻塞,Blocked(重点关注)
执行中,Runnable
暂停,Suspended
对象等待中,Object.wait() 或 TIMED_WAITING
停止,Parked
2.5.3 常用参数
2.6 jhat主要jdk自带分析工具
Sun JDK提供的jhat命令与jmap命令搭配使用,用于分析jmap生成的heap dump文件(堆转储快照)。jhat内置了一个微型的HTTP/HTML服务器, 生成dump文件的分析结果后, 用户可以在浏览器中查看分析结果(分析虚拟机转储快照信息)。
使用了jhat命令,就启动了一个http服务,端口是7000,即http://localhost:7000/,就可以在浏览器里分析。
说明:jhat命令在JDK9、JDK10中已经被删除,官方建议用VisualVM代替。
常用命令
2.7 jcmd多命令行组合
它是一个多功能的工具,可以用来实现前面除了jstat之外所有命令的功能。比如:用它来导出堆、内存使用、查看Java进程、导出线程信息、执行GC、JVM运行时间等。
2.8 jstad远程主机信息收集
三 性能调优常可视化工具
3.1 概述页面
可视化工具介绍如下: