1.JVM监控和调优的主要目的
-
性能优化:通过JVM调优,可以提高Java应用程序的性能,减少响应时间,提高吞吐量,以更好地满足用户需求。性能优化可以加快应用程序的执行速度,减少延迟,提高用户体验。
-
内存管理:JVM负责管理Java应用程序的内存。正确的内存管理可以避免内存泄漏和内存溢出等问题,确保应用程序在长时间运行时不会耗尽内存或导致性能下降。
-
垃圾回收优化:垃圾回收是JVM的核心功能之一,它负责释放不再使用的对象并回收内存。通过调整垃圾回收器的参数和策略,可以减少垃圾回收的频率和开销,提高应用程序的响应速度。
-
资源利用率:JVM调优可以帮助应用程序更有效地利用计算资源,包括CPU、内存和线程等。这有助于降低硬件成本,提高应用程序的伸缩性和性能。
-
稳定性和可靠性:JVM调优可以提高应用程序的稳定性,降低崩溃和故障的风险。通过监视和调整JVM的行为,可以减少应用程序中的内存泄漏、死锁和其他潜在问题。
-
成本效益:优化JVM性能可以减少硬件和运维成本。通过更好地利用现有资源,可以延长硬件的使用寿命,降低云计算服务的费用,从而在长期内节省资金。
总之,JVM调优是确保Java应用程序在生产环境中稳定、高性能运行的重要步骤。它需要深入理解Java虚拟机、垃圾回收机制、内存管理等方面的知识,以便根据应用程序的需求进行合适的调整和优化。通过JVM调优,可以提高应用程序的竞争力,提供更好的用户体验,并减少运维成本。
2.JVM监控和调优常用命令
2.1jps查看正在运行的Java进程
jps(Java Process Status):显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程。
基本使用语法为:jps [-q] [-mlvV] [<hostid>]
-q:仅仅显示LVMID(local virtual machine id),即本地虚拟机唯一id。不显示主类的名称等
-m:输出虚拟机进程启动时传递给主类main()的参数
-l:输出应用程序主类的全类名 或 如果进程执行的是jar包,则输出jar完整路径
-v:列出虚拟机进程启动时的JVM参数。比如:-Xms20m -Xmx50m是启动程序指定的jvm参数。---V:表示显示版本信息
hostid:RMI注册表中注册的主机名。如果想要远程监控主机上的 java 程序,需要安装 jstatd
上述命令在同一个【】内的命令也可以组合使用,示例
bdpcloud@host154[/home/bdpcloud]$ jps -mlvV
10240 DbToHiveServer-5.0.jar conf/reldbtohive -Xms512m -Xmx1g -Xss64m -Xmn128m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m
2.2jstat查看JVM统计信息
jstat(JVM Statistics Monitoring Tool):用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。常用于检测垃圾回收问题以及内存泄漏问题。
基本使用语法为:jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
查看可选项:jstat -options所有参数
类装载相关的:
-class:显示ClassLoader的相关信息:类的装载、卸载数量、总空间、类装载所消耗的时间等
JIT相关的:
-compiler:显示JIT编译器编译过的方法、耗时等信息
-printcompilation:输出已经被JIT编译的方法
垃圾回收相关的(重点):
-gc:显示与GC相关的堆信息。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息。
-gccapacity:显示内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间。
-gcutil:显示内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。
-gccause:与-gcutil功能一样,但是会额外输出导致最后一次或当前正在发生的GC产生的原因。
-gcnew:显示新生代GC状况
-gcnewcapacity:显示内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间
-gcold:显示老年代GC状况
-gcoldcapacity:显示内容与-gcold基本相同,输出主要关注使用到的最大、最小空间
其他参数说明:
[-t] : 可以在输出信息前加上一个Timestamp列,显示程序的运行时间。单位:秒
[-h<lines>]:可以在周期性数据输出时,输出多少行数据后输出一个表头信息
<vmid>:jps中的JVM进程
[<count>]]:用于指定输出统计数据的周期,单位为毫秒。即:查询间隔
<count>]]:用于指定查询的总次数
jstat -class查看
bdpcloud@host154[/home/bdpcloud]$ jstat -class 7872
Loaded Bytes Unloaded Bytes Time
23203 45413.4 0 0.0 245.35
jstat -compiler查看
bdpcloud@host154[/home/bdpcloud]$ jstat -compiler 7872
Compiled Failed Invalid Time FailedType FailedMethod
27280 8 0 1544.76 1 com/alibaba/csp/sentinel/util/TimeUtil$1 run
jstat -printcompilation 查看(输出已经被JIT编译的方法)
bdpcloud@host154[/home/bdpcloud]$ jstat -printcompilation 7872
Compiled Size Type Method
27280 456 1 redis/clients/jedis/JedisFactory validateObject
jstat -gc查看(基于内存大小分析)
示例:
bdpcloud@host154[/home/bdpcloud]$ jstat -gc 7873
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
10752.0 10752.0 6792.1 0.0 153088.0 22379.3 175104.0 16293.0 53760.0 50572.8 7168.0 6508.4 14 5.373 2 4.079 9.452
也可以指定时间,次数,打印总次数输出
bdpcloud@host154[/home/bdpcloud]$ jstat -gc -t 7873 1000 100
参数说明:
S0C:表示年轻代(Young Generation)中的 Survivor 0 区的容量(以KB为单位)。
S1C:表示年轻代中的 Survivor 1 区的容量(以KB为单位)。
S0U:表示年轻代中 Survivor 0 区的使用量(以KB为单位)。
S1U:表示年轻代中 Survivor 1 区的使用量(以KB为单位)。
EC:表示年轻代中 Eden 区的容量(以KB为单位)。
EU:表示年轻代中 Eden 区的使用量(以KB为单位)。
OC:表示老年代(Old Generation)的容量(以KB为单位)。
OU:表示老年代的使用量(以KB为单位)。
MC:表示方法区(Metaspace)的容量(以KB为单位)。
MU:表示方法区的使用量(以KB为单位)。
CCSC:表示压缩类空间(Compressed Class Space)的容量(以KB为单位)。
CCSU:表示压缩类空间的使用量(以KB为单位)。
YGC:表示年轻代垃圾回收的次数。
YGCT:表示年轻代垃圾回收所花费的总时间(以秒为单位)。