“这是我参与更文挑战的第2天,活动详情查看: 更文挑战”
上篇介绍的JVM性能监控与调优篇-概述篇,简单的介绍了下大概内容,有点像梳理知识,没错,接下来给大家介绍下JVM监控及诊断工具之命令行上篇。
一、概述
- 性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。
- Java作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成Java应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。
- 大家慢慢体会,是不是这么个道理:①使用数据说明问题,使用知识分析问题,使用工具处理问题。②无监控、不调优!哈哈哈,别动不动就提调优,没监控咋调优!!!
- 在我们刚接触Java学习的时候,大家肯定最先了解的两个命令就是javac、java,那么除此之外,还有没有其他的命令可以供我们使用呢?我们进入到安装jdk的bin目录,发现还有一系列辅助工具。这些辅助工具用来获取目标JVM不同方面、不同层次的信息,帮助开发人员很好地解决Java应用程序的一些疑难杂症。详细参考链接。
二、jps(查看正在运行的Java进程)
大家经常用的就是jps,可以带一些选项参数,比较常用的如下:
-q:仅仅显示LVMID(local virtual machine id),即本地虚拟机唯一id。不显示主类的名称等
-l:输出应用程序主类的全类名或如果进程执行的是jar包,则输出jar完整路径
-m:输出虚拟机进程启动时传递给主类main()的参数
三、jstat(查看JVM统计信息)
1.查看命令相关参数
jstat -h 或 jstat -help
2.选项option可以由以下值构成
2.1 类装载相关的
-class:显示ClassLoader的相关信息:类的装载、卸载数量、总空间、类装载所消耗的时间等
2.2 垃圾回收相关的
-gc:显示与GC相关的堆信息。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息。
-gccapacity:显示内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间。
-gcutil:显示内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。
-gccause:与-gcutil功能一样,但是会额外输出导致最后一次或当前正在发生的GC产生的原因。
-gcnew:显示新生代GC状况
-gcnewcapacity:显示内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间
-geold:显示老年代GC状况
-gcoldcapacity:显示内容与-gcold基本相同,输出主要关注使用到的最大、最小空间
-gcpermcapacity:显示永久代使用到的最大、最小空间。
2.3 JIT相关的
-compiler:显示JIT编译器编译过的方法、耗时等信息
-printcompilation:输出已经被JIT编译的方法
3. 重点介绍-gc选项
3.1 新生代相关
- S0C是第一个幸存者区的大小(字节)
- S1C是第二个幸存者区的大小(字节)
- S0U是第一个幸存者区已使用的大小(字节)
- S1U是第二个幸存者区已使用的大小(字节)
- EC是Eden空间的大小(字节)
- EU是Eden空间已使用的大小(字节)
3.2 老年代相关
- OC是老年代的大小(字节)
- OU是老年代已使用的大小(字节)
3.3 方法区(元空间)相关,针对jdk8及以后
- MC是方法区的大小
- MU是方法区已使用的大小
- CCSC是压缩类空间的大小
- CCSU是压缩类空间已使用的大小
3.4 其它
- YGC是指从应用程序启动到采样时young gc次数
- YGCT是指从应用程序启动到采样时young gc消耗的时间(秒)
- FGC是指从应用程序启动到采样时full gc次数
- FGCT是指从应用程序启动到采样时full gc消耗的时间(秒)
- GCT是指从应用程序启动到采样时gc的总时间
四、jinfo(实时查看和修改JVM配置参数)
1. 基本介绍
jinfo(Configuration Info for Java) 查看虚拟机配置参数信息,也可用于调整虚拟机的配置参数。
在很多情况下,Java应用程序不会指定所有的Java虚拟机参数。而此时,开发人员可能不知道某一个具体的Java虚拟机参数的默认值。在这种情况下,可能需要通过查找文档获取某个参数的默认值。这个查找过程可能是非常艰难的。但有了jinfo工具,开发人员可以很方便地找到Java虚拟机参数的当前值。
2. 查看
2.1 jinfo -sysprops PID
可以查看由System.getProperties()取得的参数
2.2 jinfo -flags PID
查看曾经赋过值得一些参数,比较用的多些。
2.3 jinfo -flag 具体参数 PID
查看某个Java进程的具体参数的值
3. 修改
3.1 针对boolean类型
jinfo -flag [+|-]具体参数 PID
3.2 针对非boolean类型
jinfo -flag 具体参数=具体参数值 PID
4. 扩展
4.1 java -XX:+PrintFlagsInitial
查看所有JVM参数启动的初始值
4.2 java -XX:+PrintFlagsFinal
查看所有JVM参数的最终值
4.3 java -XX:+PrintCommandLineFlags
查看那些已经被用户或者JVM设置过的详细的XX参数的名称和值
5. 总结
JVM自带的命令行工具挺丰富的,当然介绍起来也挺多的,这里先总结了JVM监控及诊断工具-命令行上篇,下篇介绍JVM监控及诊断工具-命令行下篇,jmap、jhat、jstack、jcmd的使用。
欢迎大家关注公众号(MarkZoe)互相学习、互相交流。