网站如何做查询表单,小说搜索风云榜,云南省建设厅网站职称评审,新云网站模板转载自 JVM 调优系列之监控工具 摘要: 项目部署线上之后#xff0c;我们该如何基于监控工具来快速定位问题.... 通过上一篇的jvm垃圾回收知识#xff0c;我们了解了jvm对内存分配以及垃圾回收是怎么来处理的。理论是指导实践的工具#xff0c;有了理论指导#xff0c;定位…转载自 JVM 调优系列之监控工具 摘要: 项目部署线上之后我们该如何基于监控工具来快速定位问题.... 通过上一篇的jvm垃圾回收知识我们了解了jvm对内存分配以及垃圾回收是怎么来处理的。理论是指导实践的工具有了理论指导定位问题的时候知识和经验是关键基础数据可以为我们提供依据。
在常见的线上问题时候我们多数会遇到以下问题 内存泄露 某个进程突然cpu飙升 线程死锁 响应变慢...等等其他问题。 如果遇到了以上这种问题在线下可以有各种本地工具支持查看但到线上了就没有这么多的本地调试工具支持我们该如何基于监控工具来进行定位问题?
我们一般会基于数据收集来定位而数据的收集离不开监控工具的处理比如运行日志、异常堆栈、GC日志、线程快照、堆快照等。经常使用恰当的分析和监控工具可以加快我们的分析数据、定位解决问题的速度。以下我们将会详细介绍。 JVM 常见监控工具指令
jpsJVM 进程状况工具 如果不指定hostid就默认为当前主机或服务器。
命令行参数选项说明如下 例如: jstatJVM 统计信息监控工具
jstat 是用于见识虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、jit编译等运行数据它是线上定位jvm性能的首选工具。
命令格式: 参数选项 例如:
查看 gc 情况执行jstat-gcutil 27777 jinfoJava 配置信息
命令格式 比如:获取一些当前进程的jvm运行和启动信息。 jmapJava 内存映射工具
jmap命令用于生产堆转存快照。打印出某个java进程使用pid内存内的所有‘对象’的情况如产生那些对象及其数量。
命令格式 参数选项 -dump:[live,]formatb,filefilename 使用hprof二进制形式,输出jvm的heap内容到文件. live子选项是可选的假如指定live选项,那么只输出活的对象到文件. -finalizerinfo 打印正等候回收的对象的信息. -heap 打印heap的概要信息GC使用的算法heap的配置及wise heap的使用情况. -histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量. -permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来. -F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效. -h | -help 打印辅助信息 例如
使用jmap -heap pid查看进程堆内存使用情况包括使用的GC算法、堆配置参数和各代中堆内存使用情况 使用jmap -histo[:live] pid查看堆内存中的对象数目、大小统计直方图。 jhatJVM 堆快照分析工具
jhat 命令与jamp搭配使用用来分析map生产的堆快存储快照。jhat内置了一个微型http/Html服务器可以在浏览器找那个查看。
不过建议尽量不用既然有dumpt文件可以从生产环境拉取下来然后通过本地可视化工具来分析这样既减轻了线上服务器压力有可以分析的足够详尽(比如 MAT/jprofile/visualVm)等。 jstackJava 堆栈跟踪工具
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合生成线程快照的主要目的是定位线程出现长时间停顿的原因如线程间死锁、死循环、请求外部资源导致的长时间等待等。
命令格式 参数 后续的查找耗费最高cpu例子会用到。 可视化工具
对jvm监控的常见可视化工具除了jdk本身提供的Jconsole和visualVm以外还有第三方提供的jprofilterperfino,YourkitPerf4jJProbeMAT等。这些工具都极大的丰富了我们定位以及优化jvm方式。
这些工具的使用网上有很多教程提供这里就不再过多介绍了。对于VisualVm来说比较推荐使用它除了对jvm的侵入性比较低以外还是jdk团队自己开发的相信以后功能会更加丰富和完善。
jprofilter对于第三方监控工具提供的功能和可视化最为完善目前多数ide都支持其插件对于上线前的调试以及性能调优可以配合使用。
另外对于线上dump的heap信息应该尽量拉去到线下用于可视化工具来分析这样分析更详细。如果对于一些紧急的问题必须需要通过线上监控可以采用 VisualVm的远程功能来进行这需要使用tool.jar下的MAT功能。 应用
在线上有时候某个时刻可能会出现应用某个时刻突然cpu飙升的问题。对此我们应该熟悉一些指令快速排查对应代码。
CPU 飙升
1、找到最耗CPU的进程
指令: 2、找到该进程下最耗费 CPU 的线程
指令: 3、转换进制 4、过滤指定线程打印堆栈信息
指令 可以看到是一个上报程序占用过多cpu了以上例子只为示例本身耗费cpu并不高 线程死锁
有时候部署场景会有线程死锁的问题发生但又不常见。此时我们采用jstack查看下一下。比如说我们现在已经有一个线程死锁的程序导致某些操作waiting中。
1、查找 Java 进程 ID
指令 2、查看 Java 进程的线程快照信息
指令 从输出信息可以看到有一个线程死锁发生并且指出了那行代码出现的。如此可以快速排查问题。 OOM 内存泄露
Java堆内的OOM异常是实际应用中常见的内存溢出异常。一般我们都是先通过内存映射分析工具比如MAT对dump出来的堆转存快照进行分析确认内存中对象是否出现问题。
当然了出现OOM的原因有很多并非是堆中申请资源不足一种情况。还有可能是申请太多资源没有释放或者是频繁频繁申请系统资源耗尽。针对这三种情况我需要一一排查。
OOM的三种情况: 1.申请资源内存过小不够用。 2.申请资源太多没有释放。 3.申请资源过多资源耗尽。比如线程过多线程内存过大等。 1、排查申请申请资源问题 查看新生代老生代堆内存的分配大小以及使用情况看是否本身分配过小。 从上述排查发现程序申请的内存没有问题。
2、排查 gc
特别是fgc情况下各个分代内存情况。 3、查找最费内存的对象 上述输出信息中最大内存对象才161kb,属于正常范围。如果某个对象占用空间很大比如超过了100Mb应该着重分析为何没有释放。 注意上述指令: 4、确认资源是否耗尽 pstree 查看进程线程数量 netstat 查看网络连接数量 或者采用: ll /proc/${PID}/fd | wc -l // 打开的句柄数 ll /proc/${PID}/task | wc -l 效果等同pstree -p | wc -l //打开的线程数 以上就是一些常见的jvm命令应用。 一种工具的应用并非是万能钥匙包治百病问题的解决往往是需要多种工具的结合才能更好的定位问题无论使用何种分析工具最重要的是熟悉每种工具的优势和劣势。这样才能取长补短配合使用。