在Java服务中,除了对于 业务、接口耗时&性能的监控之外还需要对Java 所依赖的JVM进行一定的监控策略。 对于JVM的合理监控可以帮助我们更加全面的发现问题:比如说内部接口耗时忽然上升、oom频出这类问题,并且合理的JVM监控及分析策略,能够以此为依据进行服务所使用JVM的调优,从而提升稳定性及性能。 JVM 自带了一些工具,已经基本能够全面的分析JVM的使用情况了: jstat:JVM 内存监视工具,可以看到任何堆内存、非堆内存的使用情况及young GC发生的时间&次数、full GC的时间&次数 来进行监控,但是在实际生产环境中,这个并不适用。 具体的调优策略会在JVM系列的JVM参数介绍时说明,这里仅仅是介绍对应的工具,及我们能用这些工具做什么。
CPU,IO,内存 -p 指定进程 –u 监控CPU 每秒采样 一共3次 -t 显示线程 TID 线程id CPU哪个核 五.windows 任务管理器:cpu ,io perfmon pslist 的参数 2.jinfo 查看java应用程序的扩展参数 -flag <name>:打印指定JVM的参数值 -flag [+|-]<name>:设置指定JVM参数的布尔值 -flag <name>=< value>:设置指定JVM参数的值 jinfo -flag PrintGCDetails 2972 3.jmap 生成java应用程序的堆快照和对象的统计信息 4.jstack 打印线程dump - l 打印锁信息 -m 打印java和native的帧信息 -F强制dump,当jstack没有响应时候使用 5.JConsole 图形化监控工具 可以查看Java应用程序的运行概况,监控堆信息、永久区使用情况 1.jps 查看程序进程 2.jstack 输出dump 3.top 查看占用cpu最多的进程id 4.pidstat 查看进程id下线程占用cpu 最多 ,TID线程id转换成16进制 ,nid 5.
前言 了解了部分JVM运行的原理之后,就要进入实战环节啦.在实际工作中,我们既不需要去实现虚拟机,也不需要对垃圾收集或者内存分配过程进行DEBUG.但是我们经常需要对某个应用程序进行JVM层面的调优. 可能是因为我们的代码和JVM配合不够好,也可能是我们的代码直接就有问题,但是需要在JVM上找到错误的具体表现. JDK的可视化工具 在本地启动JVM,可以在JDK/bin目录下启动jconsole,或者VisualVM.可以打开图形界面,按照其中的引导,连接虚拟机,点击内存,线程等按钮即可查看当前虚拟机状态.这里就不展开了
1.前言: 我们的监控系统是zabbix,最近刚做完jvm还有tomcat的监控,需要吐槽以下内容: zabbix官方提供的jvm和tomcat监控模版,存在item书写格式的坑,导致很多内容无法获取到监控 本文监控jvm内容如下: 内存使用状态:堆内存(Heap memory)和非堆内存(No Heap memory),包括已用值、最大值、已提交; 堆内存内存池:新生代(eden space),survivor =8090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" 3、 org.archive.jmx.Client HeapMemoryUsage: committed: 2146959360 init: 2147483648 max: 2146959360 used: 407611808 3. 原文:西门飞冰的博客-专注于Linux运维 » zabbix监控tomcat(包含jvm监控)。
Zabbix自带监控系统的内存利用率和CPU利用率,但是系统内存并不能反应JVM内存情况 在本地我们可以通过jconsole或者jvisualvm进行监控jvm内存情况 不过正是环境一般都是部署在linux jvm详情了,如上效果图 linux测试 需要下载cmdline-jmxclient-0.10.3.jar包 通过上述方式启动之后如下 ? jvm内存情况集成jmx步骤逻辑 在zabbix服务器上安装配置zabbix-java-gateway,并且配置相关参数。 Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar tale-latest.jar --server.port=80 3. 第二步,添加你需要的监控项即可 ? 这里选取四项,查看效果图 ? ok,其余的配置再摸索,监控多个java进程的jvm还须研究
JVM-7.JVM 性能监控 jdk命令 常见监控和故障处理工具 名称 描述 jps JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程 jstat JVM Statistics jinfo Configuration Info for Java,显示虚拟机配置信息 jmap Memory Map for Java,生成虚拟机的内存转储快照(heapdump文件) jhat JVM 参数 2. jstat:虚拟机统计信息监视工具 jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的工具。 gcpermcapacity 输出永久带使用的最大最小空间(jdk1.8测试没有该选项) -compiler 输出JIT编译器编译过的方法,耗时等信息 -printcompilation 输出已经被JIT编译过的方法 3. HeapDumpOnOutOfMemoryError参数,使虚拟机在OOM异常出现之后自动生成dump文件 -XX:+HeapDumpOnCtrlBeak参数,ctrl+break键可以使虚拟机生成dump文件 kill -3命令
该shell脚本主要用于监控: 1.各个进程的jvm内存使用情况; 2.端口监控; 3.访问的页面是否正常。 *-Dweblogic.Name=//g'|awk '{print $1}'` #jvm内存监控 echo ############################################## ] then jvm=$jvm+${name1}+":Perm Generation:"+${perm}+"%超阀值 " fi echo $jvm done #端口监控 if [ "$name" an |grep $port|grep LISTEN|grep $addr` if [ "$net" = "" ] then p1=$p1+${port}+"端口异常" fi done #url监控 ** sleep $step done exit 0 ---- 监控截图: [bech8l6wx7.jpeg] [475ldqsxa2.png]
JVM之常用监控工具 jps jinfo 获取配置信息 基本语法 jinfo [options] <pid> 常用选项 -sysprops:显示JVM进程的系统属性。 -flags:显示用于启动JVM的命令行标志和VM选项。 -flag <name>:显示指定JVM标志的当前值。 -flag [+|-]<name>:启用或禁用指定的JVM标志。 常用示例 获取正在运行的JVM的系统属性: jinfo -sysprops 608 .... 获取用于启动JVM的命令行标志和VM选项: [root@VM-16-3-centos ~]# jinfo -flags 608 Attaching to process ID 608, please wait 常用示例 显示堆的使用情况 [root@VM-16-3-centos ~]# jmap -heap 608 Attaching to process ID 608, please wait...
JVM监控工具 Java的安装包自带了很多优秀的工具,善用这些工具对于监控和调试Java程序非常有帮助。 jstat ---- 用途:jstat利用了JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控等等。 [root@localhost bin]# jstat -printcompilation -h3 25917 1000 5 每1000毫秒打印一次,一共打印5次,还可以加上-h3每三行显示一下标题。 采用 jstat -gcutil PID 10000 监控更简洁直观。 `date`" jmap_stat.sh 长期监控jmap状况。 #!
介绍 在生产环境中,经常会遇到各种各样奇葩的性能问题,所以掌握最基本的JVM命令行监控工具还是很有必要的 名称 主要作用 jps 查看正在运行的Java进程 jstack 打印线程快照 jmap 导出堆内存映像文件 jstat 查看jvm统计信息 jinfo 实时查看和修改jvm配置参数 jhat 用于分析heapdump文件 jps:查看正在运行的Java进程 jps可以列出正在运行的Java进程,并显示虚拟机执行主类 help] jps [-q] [-mlvV] [<hostid>] Definitions: <hostid>: <hostname>[:<port>] 「可以看到可以监控远程服务 但是基于安全考虑,一般不使用」 常见的选项如下 选项 作用 -q 只输出进程id -m 输出传递给主类main函数的参数 -l 输出主类全类名,如果进程执行的是Jar包,输出jar包名字 -v 程序启动时指定的jvm 含义如下 Loaded 解释 Loaded 加载类的个数 Bytes 加载类的字节数 Unloaded 卸载类的个数 Bytes 卸载类的字节数 Time 花费的时间 jinfo:实时查看和修改jvm
JVM性能监控工具是我们的得力助手,它们可以帮助我们追踪内存使用、线程情况、垃圾回收等关键指标,从而更好地了解应用程序的健康状况。 本文将介绍一些常用的JVM性能监控工具,并详细展示它们的用法,以便帮助你更好地监控和优化Java应用程序。 用法示例 监控JVM进程 打开VisualVM,点击“远程”选项卡。 在“本地”栏中选择要监控的JVM进程,点击“连接”。 在“监控”选项卡下,你可以查看内存使用情况、线程信息、类加载器等。 创建一个新的飞行记录会话,选择要监控的JVM进程。 在飞行记录会话中,你可以启动和停止飞行记录,并实时监控性能指标。 控制台 在Mission Control中,点击“控制台”选项。 工具四:JConsole 简介 JConsole是JDK自带的一个监控工具,它提供了一些基本的JVM性能监控功能,适合快速查看应用程序的健康状况。
主要参数有: 1)-l 打印模块名以及包名 2)-v 打印传给JVM的参数 3)-m打印传给main方法的参数 jstat 用于打印JVM进程的性能数据,主要用来查看JVM gc相关的数据 jstat用法 其中-gc可以换成-class 、-gcnew、-gcold等参数;而54992表示的JVM的进程id(可能通过上面的jps命令查看) ;4s表求每4秒打印一次,后面的3表求共打印三次 jmap jmap用于分析JVM中堆中的对象,包括生成堆的dump文件,这个命令同样有多条子命令。 jmap -histo:live使用示例 3:jmap -dump :用于导出JVM的堆快照文件,方便用GUI工具分析。 ? jmap -finalizerinfo使用示例 注意:jmap依赖于 Java 虚拟机的Attach API,因此只能监控本地的java进程。
public static void main(String[] args) throws Exception { fillHeap(1000); } } 可以观察到JConsole监控到的情况为 1.3线程监控 相当于jstack命令,线程停顿可以用这个标签页进行监控分析。 Runnable的testBusyThread 3.testLockThread线程等待lock对象的notify或者notifyAll方法。
pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+):' name: tomcat_$3_ total labels: port: "$2" protocol: "$1" help: Tomcat global $3 type: COUNTER - pattern: =none, J2EEServer=none><>(requestCount|maxTime|processingTime|errorCount):' name: tomcat_servlet_$3_ total labels: module: "$1" servlet: "$2" help: Tomcat servlet $3 total type: COUNTER - 配置Prometheus 添加tomcat到prometheus tail -3 /usr/local/prometheus/prometheus.yml - job_name: 'tomcat'
用于对JVM中内存、线程和类等的监控,是一个基于JMX(java management extensions)的GUI性能监控工具。 主要功能: 1.生成/读取堆内存/线程快照 2.查看JVM参数和系统属性 3.查看运行中的虚拟机进程 4.程序资源的实时监控 5.JMX代理连接、远程环境监控、CPU分析和内存分析 官方地址:https ,优化内存使用 3-线程和锁:JProfiler提供多种针对线程和锁的分析视图助您发现多线程问题 4-高级子系统:许多性能问题都发生在更高的语义级别上。 在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 有什么办法可以监控到JVM的实时运行状态? 怎么快速定位应用的热点,生成火焰图? 官方地址:https://arthas.aliyun.com/doc/quick-start.html
一、概述 JMX Exporter https://github.com/prometheus/jmx_exporter 它是Prometheus官方组件,作为一个JAVA Agent来提供本地JVM 本文参考链接: https://chanjarster.github.io/post/prom-grafana-jvm/
Java JVM监控工具JConsole简介 jconsole命令 功能:打开java监视管理控制台 方法: jconsole [选项1] [选项2] …… [选项n] 常用选项: -help 2)关于内存的相关说明 Java VM管理两种内存:堆内存(heap memory)和非堆内存(non-heap memory),两者都是在JVM启动时被创建。 堆内存:JVM为所有类实例和数组分配内存的运行时数据区。堆内存大小可以是固定大小或者动态变化的。 垃圾收集器是一个会回收对象堆内存的自动化内存管理系统 非堆内存:包含被所有线程共享的方法区和JVM用于内部处理或优化的必备内存。 3)其他 右键等手动操作或看界面文字提示就知道了,这里就不多说了 参考连接: http://my.oschina.net/chenleijava/blog/157682
当获得 Java 进程的进程 ID 之后,我们便可以调用接下来介绍的各项监控及诊断工具了。 jstat jstat命令(帮助文档)可用来打印目标 Java 进程的性能数据。 反过来说,如果你不想被其他进程监控,那么你需要开启该参数。 jinfo jinfo命令(帮助文档)可用来查看目标 Java 进程的参数,如传递给 Java 虚拟机的-X(即输出中的 jvm_args)、-XX参数(即输出中的 VM Flags),以及可在 Java SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC VM Arguments: jvm_args 总结与实践 今天我介绍了 JDK 中用于监控及诊断的命令行工具。我们再来回顾一下。 jps将打印所有正在运行的 Java 进程。
2) 下载JMX exporter到这个目录 3) 新建一个文件simple-config.yml内容如下: --- lowercaseOutputLabelNames: true lowercaseOutputName process_cpu_time)\w+):' name: os_$1 type: GAUGE attrNameSnakeCase: true 4) 运行以下命令启动3个Tomcat, 记得把<path-to-prom-jvm-demo>替换成正确的路径: docker run -d \ --name tomcat-1 \ -v <path-to-prom-jvm-demo>: >:/prometheus-config \ prom/prometheus --config.file=/prometheus-config/prom-jmx.yml 3) 访问http://localhost 3) 添加Prometheus数据源,如下图所示到添加数据源页面: ?
如何使用JDK自带jvisualvm监控工具 使用jvisualvm、jmc远程监控JVM 部分参数说明 ? ? Visual GC(监控垃圾回收器) 有人说“JVM的内存分为两块堆和栈”,还有人说"JVM的内存分为三块(新生代、老年代、方法区)"该有个结论了 对于堆栈说法的人他们是根据下图中的维度来看问题的 ? 要看懂上面的图必须理解Java虚拟机的一些基本概念: 堆(Heap) :JVM管理的内存叫堆 分代:根据对象的生命周期长短,把堆分为3个代:Metaspace,Old和Young,根据不同代的特点采用不同的收集算法 接下来介绍另一个JDK自带的监控工具jmc,打开bin/jmc.exe 之后,jmc即可扫描出本地运行的JVM进程 ? 选择一个进程,点开选择MBean服务器,右键 启动JMX控制台,即可看到监控信息 ? 如果想要用jmc监控远程的JVM进程,配置方式和jvisualvm方式一一样即可。