JVM性能监控与故障处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzxlfly/article/details/83099253

JVM调优离不开一些命令工具,那就是jdk提供的一些命令工具,这些工具都非常稳定而且功能强大,能在处理应用程序性能问题、定位故障时发挥很大的作用。

一、JDK的命令行工具

JDK的jdk/bin提供了一系列监控命令

这些命令行大多数是jdk/lib/tools.jar类库的一层薄包装,它们主要的功能代码是在tools类库中实现的

JVM常用监控命令一览表

名称 主要作用
jps 显示指定系统内所有的虚拟机进程
jstat 用于收集虚拟机各方面的运行数据
jinfo 显示虚拟机配置信息
jmap 生成虚拟机的内存转储快照(heapdump文件)
jhat 用于分析heapdump文件,它会建立一个http/html服务器,让用户可以在浏览器上查看分析结果
jstack 显示虚拟机的内存快照

1、jps主要用于显示虚拟机进程,也最常用

 语法:jps options hostid

选项 作用
-q 只输出LVMID,省略主类名
-m 输出虚拟机进程启动时传递给主类main()函数的参数
-l 输出主类全类名,如果进程执行的是jar包,输出jar路径
-v 输出虚拟机进程的JVM启动参数

示例:jps

[root@cloudera02 hbase-transform]# jps
18465 Jps
1090 CoarseGrainedExecutorBackend
1186 QuorumPeerMain
9284 HRegionServer
18798 Application
6382 DataNode
718 jar

示例:jps -q

root@cloudera02 hbase-transform]# jps -q
1090
1186
9284
9445
18798
6382
718

示例:jps -m

[root@cloudera02 hbase-transform]# jps -m
1090 CoarseGrainedExecutorBackend --driver-url spark://[email protected]:13933 --executor-id 4 --hostname cloudera02 --cores 1 --app-id application_1534665310719_0003 --user-class-path file:/mnt/sdb/yarn/nm/usercache/hdroot/appcache/application_1534665310719_0003/container_1534665310719_0003_01_000005/__app__.jar
1186 QuorumPeerMain /var/run/cloudera-scm-agent/process/300-zookeeper-server/zoo.cfg
9284 HRegionServer start
15689 Jps -m
18798 Application --conf-file ./conf/pro_rwb.conf --name agent_dm_rwb_spark
6382 DataNode
718 jar

示例:jps -l

root@cloudera02 hbase-transform]# jps -l
1090 org.apache.spark.executor.CoarseGrainedExecutorBackend
1186 org.apache.zookeeper.server.quorum.QuorumPeerMain
9284 org.apache.hadoop.hbase.regionserver.HRegionServer
9445 sun.tools.jps.Jps
18798 org.apache.flume.node.Application
6382 org.apache.hadoop.hdfs.server.datanode.DataNode
718 task-hbase-transform.jar

示例:jps -v

[root@cloudera02 hbase-transform]# jps -v
1090 CoarseGrainedExecutorBackend -Xmx5120m -DLog4j.configuration=log4j.properties -Djava.io.tmpdir=/mnt/sdb/yarn/nm/usercache/hdroot/appcache/application_1534665310719_0003/container_1534665310719_0003_01_000005/tmp -Dspark.authenticate=false -Dspark.driver.port=13933 -Dspark.shuffle.service.port=7337 -Dspark.yarn.app.container.log.dir=/mnt/sdb/yarn/container-logs/application_1534665310719_0003/container_1534665310719_0003_01_000005 -XX:OnOutOfMemoryError=kill %p
1186 QuorumPeerMain -Djava.net.preferIPv4Stack=true -Dzookeeper.log.file=zookeeper-cmf-zookeeper-SERVER-cloudera02.log -Dzookeeper.log.dir=/mnt/sdb/var/log/zookeeper -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djute.maxbuffer=4194304 -Dzookeeper.datadir.autocreate=false -Xms1073741824 -Xmx1073741824 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/mnt/sdb/tmp/zookeeper_zookeeper-SERVER-a4dfaf9c0460ddf17b400ac15a0dac0d_pid1186.hprof -XX:OnOutOfMemoryError=/usr/lib64/cmf/service/common/killparent.sh
9284 HRegionServer -Dproc_regionserver -XX:OnOutOfMemoryError=kill -9 %p -Djava.net.preferIPv4Stack=true -Xms17646485504 -Xmx17646485504 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/mnt/sdb/tmp/hbase_hbase-REGIONSERVER-a4dfaf9c0460ddf17b400ac15a0dac0d_pid9284.hprof -XX:OnOutOfMemoryError=/usr/lib64/cmf/service/common/killparent.sh -Dhbase.log.dir=/mnt/sdb/var/log/hbase -Dhbase.log.file=hbase-cmf-hbase-REGIONSERVER-cloudera02.log.out -Dhbase.home.dir=/mnt/sdb/opt/cloudera/parcels/CDH-5.12.1-1.cdh5.12.1.p0.3/lib/hbase -Dhbase.id.str= -Dhbase.root.logger=INFO,RFA -Djava.library.path=/mnt/sdb/opt/cloudera/parcels/CDH-5.12.1-1.cdh5.12.1.p0.3/lib/hadoop/lib/native:/mnt/sdb/opt/cloudera/parcels/CDH-5.12.1-1.cdh5.12.1.p0.3/lib/hbase/lib/native/Linux-amd64-64 -Dhbase.security.logger=INFO,RFAS
18798 Application -Xmx20m -Dflume.root.logger=INFO,console -Djava.library.path=:/opt/cloudera/parcels/CDH-5.12.1-1.cdh5.12.1.p0.3/lib/hadoop/lib/native:/opt/cloudera/parcels/CDH-5.12.1-1.cdh5.12.1.p0.3/lib/hadoop/lib/native:/opt/cloudera/parcels/CDH-5.12.1-1.cdh5.12.1.p0.3/lib/hbase/bin/../lib/native/Linux-amd64-64
6382 DataNode -Dproc_datanode -Xmx1000m -Dhdfs.audit.logger=INFO,RFAAUDIT -Dsecurity.audit.logger=INFO,RFAS -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/mnt/sdb/var/log/hadoop-hdfs -Dhadoop.log.file=hadoop-cmf-hdfs-DATANODE-cloudera02.log.out -Dhadoop.home.dir=/mnt/sdb/opt/cloudera/parcels/CDH-5.12.1-1.cdh5.12.1.p0.3/lib/hadoop -Dhadoop.id.str=hdfs -Dhadoop.root.logger=INFO,RFA -Djava.library.path=/mnt/sdb/opt/cloudera/parcels/CDH-5.12.1-1.cdh5.12.1.p0.3/lib/hadoop/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Xms1073741824 -Xmx1073741824 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/mnt/sdb/tmp/hdfs_hdfs-DATANODE-a4dfaf9c0460ddf17b400ac15a0dac0d_pid6382.hprof -XX:OnOutOfMemoryError=/usr/lib64/cmf/service/common/killparent.sh -Dhadoop.security.logger=INFO,RFAS
718 jar
1008 CoarseGrainedExecutorBackend -Xmx5120m -DLog4j.configuration=log4j.properties -Djava.io.tmpdir=/mnt/sdb/yarn/nm/usercache/hdroot/appcache/application_1534665310719_0003/container_1534665310719_0003_01_000004/tmp -Dspark.authenticate=false -Dspark.driver.port=13933 -Dspark.shuffle.service.port=7337 -Dspark.yarn.app.container.log.dir=/mnt/sdb/yarn/container-logs/application_1534665310719_0003/container_1534665310719_0003_01_000004 -XX:OnOutOfMemoryError=kill %p
9968 Kafka -Xmx1024M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/kafka_kafka-KAFKA_BROKER-a4dfaf9c0460ddf17b400ac15a0dac0d_pid9968.hprof -XX:OnOutOfMemoryError=/usr/lib64/cmf/service/common/killparent.sh -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark -XX:+DisableExplicitGC -Djava.awt.headless=true -Xloggc:/var/run/cloudera-scm-agent/process/319-kafka-KAFKA_BROKER/kafkaServer-gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9393 -Dkafka.logs.dir=/var/run/cloudera-scm-agent/process/319-kafka-KAFKA_BROKER -Dlog4j.configuration=file:/var/run/cloudera-scm-agent/process/319-kafka-KAFKA_BROKER/log4j.properties

2、jstat:统计虚拟机信息

语法:jstat [option vmid [interval [s|ms]  [count] ] ]

示例:jstat 2241 500 10 

作用:每隔500ms查询一次进程2241垃圾回收状况,共查询10次 

3、jinfo:java信息配置

语法:jinfo [option] pid

示例:jinfo -flag  CMSInitiatingOccupancyFraction 2241

作用:查询CMSInitiatingOccupancyFraction参数值

4、jmap:java内存映射

语法:jmap [option] pid

示例:jmap -heap 2241

作用:显示java堆信息使用状况

5、jhat:堆转存快照分析

语法:jhat [ options ] heap-dump-file

作用:用于分析jmap生成的内存快照

6、jstack:java堆栈跟踪

语法:jstack [ options ] vmid

作用:用于生成虚拟机当前时刻的线程快照,定位线程长时间停顿的原因。

二、JDK的可视化工具

JDK提供了两大可视化工具JConsole和VisualVM

1、JConsole监控

假设我们已经配置了环境变量,在cmd命令行中输入jconsole,会弹出以下界面

本地进程会直接出现列表中,如eclipse进程,选中直接打开即可。

 连接远程java进程时需要在启动时配置参数,在服务器192.168.172.72运行一个可执行jar

java 
-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=192.168.172.72        #进程所在ip,可省略        
-Dcom.sun.management.jmxremote.ssl=false          #关闭ssl
-Dcom.sun.management.jmxremote.authenticate=false #不启用密码连接
-Dcom.sun.management.jmxremote.port=8899          #JConsole 连接端口
-jar email_service_1.0.0.jar     #jar包

如果是tomcat进程,可以在catalina.out配置

JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=192.168.172.72 -Dcom.sun.management.jmxremote"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=8899"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=true" #true开启用户、密码认证
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.pwd.file=/usr/java/jdk1.8/jre/lib/management/jmxremote.password" #用户名、密码文件路径

在客户端远程连接192.168.172.72:8899

连接成功如下

2、VisualVM多合一故障处理

 未完待续

猜你喜欢

转载自blog.csdn.net/lzxlfly/article/details/83099253
今日推荐