jvirualvm 监控 jvm应用

今天打开jvm本来想监控一下本机jvm应用的性能,突然发现一年前帮一个广告平台做性能优化的配置居然还能看到相关应用信息,该平台一天单表数据量大概500w左右,忙时上千万数据,采用mysql分库每天定期分表;
很多时候我们要对这种高并发的应用都要进行实时监控,一方面可以监控性能差的程序,另一方面及时发现程序运行异常信息;

使用jmx监控,jvm配置如下:

-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=×××××××××
-Dcom.sun.management.jmxremote.port=8000
-Dcom.sun.management.jmxremote.rmi.port=8000
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

使用jvirualvm配置连接应用后,我们在jvirualvm(免费)可以看到如下信息:
jvirualvm 监控 jvm应用
我们还可以看到操作系统相关信息:
jvirualvm 监控 jvm应用

线程执行的状态:
jvirualvm 监控 jvm应用
上图可以看到应用线程数量800个线程,是属于非常多的了,很多主流线程,没用的线程可以适当的关闭,及优化相关线程池,同时我们可以看到线程大概的执行情况,绿色为持续执行时间。

如果要对java线程使用方法监控,点击抽样器->cpu:
jvirualvm 监控 jvm应用

上图我们可以看到方法执行时间,当然我们还可以对方法里面的执行树进行查看,如上图点击CPU->快照,得到下图一,图二:

jvirualvm 监控 jvm应用
jvirualvm 监控 jvm应用

这里可以看到一个线程大概都执行了哪些方法,并且可以得知那些方法执行得比较慢。可以很好的实时监控程序性能,和一些问题程序,图二可看到一个线程执行的方法及相应时间;有时候解决程序性能的问题会比日志管用,因为这些图标都是实时的。

还可以jvm内存对象进行监控,类似jvm命令 jmap -histo:live pid,点击内存->快照,得到下图一
jvirualvm 监控 jvm应用
上图注意,可以对查询对象进行查询,上图查询com,可知该应用有大量活跃对象在运行;

分析内存:

因为程序是cms回收策略,且程序是属于高并发应用,标记缩减算法会产生大量空间碎片,空间碎片太多同样会发生fullgc导致会导致停顿;可能是算法的原因导致对象不回收;这里需要将回收策略改成G1回收,让程序可以分代回收,减少空间碎片,减少停顿;另外,这里需要找出为啥那么多对象不回收,检查程序写的是否有问题。

以上就是jvirualvm的基本使用。其实jdk自带的工具挺多的,还有jconsole可以对mbean查询并且修改,或者mbean对于大家都很陌生,但是程序里面一点都不陌生,几乎每个java应用都会使用mbean,别问为什么,动手监控一下就知道啦,哈;典型的运用就是查看连接池配置,如druid,kafka的java客户端及服务端,都可以通过jconsole查看配置,甚至修改配置。

相关推荐