一 概述
1)性能诊断是软件工程师在日常的工作中需要经常面对和解决的问题,在用户体验之上的今天,解决好应用的性能问题能带来非常大的收益
2)Java作为最流程的编程语言之一,其应用性能诊断一直受到业界中广泛的关注,可能造成Java应用出现性能问题的因素非常多。如线程控制,磁盘读写,数据库访问,网络IO,垃圾收集等。想要定位出这些问题,一款优秀的性能诊断工具是必不可少的。
3)使用数据说明问题,使用知识来分析问题,使用工具处理问题。
4)无监控,不调优。
5)简单命令行工具:在JDK安装目录下,再进入bin目录,这里可以看到一些列的辅助工具,这些辅助工具可以帮助我们使用获取JVM的不同方面,不同层次的信息,帮助开发人员更好的解决Java应用程序的一些疑难杂症。
二 jps-查看运行的Java进程
2.1 基本情况
1)jps:Java Process Status
2)显式指定系统内所有HotSpot虚拟机进程,查看虚拟机的进程信息,可以用于查询正在运行的虚拟机进程
3)说明:对于本地的虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的,是唯一的
2.2 测试
2.3 基本语法
2.3.1 options参数
1)-q:仅仅显示LVMID(local virtual machine id)本地虚拟机唯一id,不显示Java进程主类的名称。
2)-l:输出应用程序主类的全类名 或者 如果进程执行的是jar包,就输出jar包的完整路径
3)-m:输出虚拟机进程启动时传递给主类main()方法的参数
4)-v:列出虚拟机进程启动时候的JVM参数,比如:-Xms20m -Xmx50m时启动应用程序时指定的JVM参数
5)说明:以上的参数都可以综合使用
6)注意:如果Java进程关闭了默认开启的UsePerfData参数(即使用参数-XX:-UsePerfData),那么jp命令(以及下面介绍的jstat)将无法探知到该Java进程。
2.3.2 hostid参数
1)RMI注册表中注册的主机名
2)如果想要远程监控主机上的Java程序,需要安装jstatd
3)对于对于具有更严格的安全实践的网络场所来说,可能使用一个自定义的策略文件来显示对于特定的可信主机或者网络的访问,尽管这种技术容易受到IP地址的欺诈攻击
4)如果安全问题无法使用一个定制的策略文件来处理,那么最安全的操作就是不运行jtatd服务器,而是在本地使用jstat和jps工具
三 jstat-查看JVM统计信息
3.1 基本情况
1)jstat(JVM statistic Motitoring Tool)用于监控虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类加载,内存,垃圾收集,JIT编译等运行数据
2)在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。常用于检测垃圾回收问题以及内存泄漏问题
3)官网文档:。。。。
3.2 基本语法
语法: jstat - 查看命令相关参数: jstat -h 或者 jstat -help
3.2.1 option参数
- 与类装载相关
1)-class:显示ClassLoader的相关信息,类的装载,卸载数量,总空间,类装载所消耗的时间等
- 垃圾回收相关
1)-gc:显示与GC相关的堆信息。包括Eden区,两个Servivor区,老年代,永久代等的容量,已用的空间,GC时间合计等信息
2)-gccapacity:显示内容与-gc基本相同,但是输出主要关注Java堆各个区域使用到的最大最小空间
3)-gcutil:显示内容与-gc基本相同,但是输出主要关注已经使用空间占总空间的百分比
4)-gccause:与-gcutil功能一样,但是会额外输出导致最后一次或者当前正在发正的GC产生的原因
5)-gcnew:显示新生代GC状况
6)-gcnewcapacity:显示内容和-gcnew基本相同,输出主要关注使用到最大最小的空间
7)-geold:显示老年代GC状况
- JIT相关
1)-compiler:显示JIT编译器编译过的方法,耗时等信息
2)-printcompilation:输出已经被JIT编译的方法
3.3 补充说明
四 jinfo-实时查看和修改JVM配置参数
4.1 基本情况
1)jinfo(Configuration Info for Java)查看虚拟机的配置参数信息,也可以调整虚拟机配置参数(get,set)
2)很多情况下,Java应用程序不会指定所有的Java虚拟机参数。所以开发人员可能不知道某一个具体的Java虚拟机参数的默认值。
3)有了jinfo工具,开发人员可以很方便的找到Java虚拟机参数的当前值
4.2 基本语法
- jinfo [options] pid | 选项 | 选项说明 | | :—-: | :—-: | | no option | 输出全部的参数和系统属性 | | -flag name | 输出对应名称的参数 | | -flag [+-] name | 开启或者关闭对应名称的参数,只有被标记为manageable的参数才可以被动态修改 | | -flag name=value | 设定对应名称的参数 | | -flag | 输出全部的参数 | | -syspros | 输出系统属性 |
4.2.1 查看
1)jinfo -sysprops PID:可以查看System.getProperties()
2)jinfo -flags PID:查看曾经赋过值的一些参数
3)jinfo -flag 具体参数 PID:可以查看某个Java进程的具体参数
4.2.2 修改
1)jinfo不仅可以查看运行时某个Java虚拟机参数的实际取值,甚至可以在运行时修改部分参数,并使之立即生效。
2)但是,并非所有参数都支持动态修改的,参数只有被标记为:manageable的flag可以被实时修改,其实,这个修改功能是十分有限的。
# 查看被标记为manageable的参数
java -XX:+PrintFlagFinal -version |grep manageable
3)修改Boolean类型:jinfo -flag 【[+-]具体参数】 【PID】
4)修改非Boolean类型:jinfo -flag 【具体参数=具体参数值】【PID】