专栏名称: OSC开源社区
OSChina 开源中国 官方微信账号
目录
相关文章推荐
51好读  ›  专栏  ›  OSC开源社区

JVM 调优系列之监控工具

OSC开源社区  · 公众号  · 程序员  · 2017-10-23 08:30

正文


摘要: 项目部署线上之后,我们该如何基于监控工具来快速定位问题....


通过上一篇的 jvm垃圾回收知识 ,我们了解了jvm对内存分配以及垃圾回收是怎么来处理的。理论是指导实践的工 具,有了理论指导,定位问题的时候,知识和经验是关键基础,数据可以为我们提供依据。


在常见的线上问题时候,我们多数会遇到以下问题:


  • 内存泄露

  • 某个进程突然cpu飙升

  • 线程死锁

  • 响应变慢...等等其他问题。


如果遇到了以上这种问题,在线下可以有各种本地工具支持查看,但到线上了,就没有这么多的本地调试工具支持,我们该如何基于监控工具来进行定位问题?


我们一般会基于数据收集来定位,而数据的收集离不开监控工具的处理,比如:运行日志、异常堆栈、GC日志、线程快照、堆快照等。经常使用恰当的分析和监控工具可以加快我们的分析数据、定位解决问题的速度。以下我们将会详细介绍。


JVM 常见监控工具&指令


jps:JVM 进程状况工具



如果不指定hostid就默认为当前主机或服务器。


命令行参数选项说明如下:



例如:



jstat:JVM 统计信息监控工具


jstat  是用于见识虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、jit编译等运行数据,它是线上定位jvm性能的首选工具。


命令格式:



参数选项:



例如:


查看 gc 情况执行:jstat-gcutil 27777



jinfo:Java 配置信息


命令格式:



比如:获取一些当前进程的jvm运行和启动信息。



jmap:Java 内存映射工具


jmap命令用于生产堆转存快照。打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。


命令格式:



参数选项:


-dump:[live,]format=b,file= 使用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查看堆内存中的对象数目、大小统计直方图。



jhat:JVM 堆快照分析工具


jhat 命令与jamp搭配使用,用来分析map生产的堆快存储快照。jhat内置了一个微型http/Html服务器,可以在浏览器找那个查看。


不过建议尽量不用,既然有dumpt文件,可以从生产环境拉取下来,然后通过本地可视化工具来分析,这样既减轻了线上服务器压力,有可以分析的足够详尽(比如 MAT/jprofile/visualVm)等。


jstack:Java 堆栈跟踪工具


jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。


命令格式:



参数:



后续的查找耗费最高cpu例子会用到。


可视化工具


对jvm监控的常见可视化工具,除了jdk本身提供的Jconsole和visualVm以外,还有第三方提供的jprofilter,perfino,Yourkit,Perf4j,JProbe,MAT等。这些工具都极大的丰富了我们定位以及优化jvm方式。


这些工具的使用,网上有很多教程提供,这里就不再过多介绍了。对于VisualVm来说,比较推荐使用,它除了对jvm的侵入性比较低以外,还是jdk团队自己开发的,相信以后功能会更加丰富和完善。


jprofilter对于第三方监控工具,提供的功能和可视化最为完善,目前多数ide都支持其插件,对于上线前的调试以及性能调优可以配合使用。


另外对于线上dump的heap信息,应该尽量拉去到线下用于可视化工具来分析,这样分析更详细。如果对于一些紧急的问题,必须需要通过线上监控,可以采用 VisualVm的远程功能来进行,这需要使用tool.jar下的MAT功能。



应用


在线上有时候某个时刻,可能会出现应用某个时刻突然cpu飙升的问题。对此我们应该熟悉一些指令,快速排查对应代码。








请到「今天看啥」查看全文


推荐文章
意林  ·  写了又删的才是心里话
8 年前
枕边阅读  ·  平胸的女孩追不到男神
7 年前
玩转手机摄影  ·  大神,可以帮我P张图吗?
7 年前
好生活杂货铺  ·  晃剪报
7 年前