目标:使用JDK自带的JVM监测工具调试内存使用情况及堆栈问题排查
简要说明:在实际项目开发过程中,如果使用多线程,但是没有控制好线程数量的情况下,就会出现堆内存溢出问题,导致功能服务宕机,如果严重很可能导致服务器宕机问题。当出现内存溢出时,只能看到简单的内存溢出日志,排查问题毫无头绪,不知道哪里线程出现问题,这样就很难解决问题;
这时我们就可以通过JDK自带的JVM监控工具查看每个线程的生命周期以及相关源码追溯,这样就可以清楚明了的看清问题出现在哪里,然后根据实际情况解决问题;
1、监控软件位置:在JDK安装目录下的bin目录下,我的位置如下图:
image.png
2、该软件支持监控本地服务、远程服务等功能,接下来演示监控本地服务
2.1 本地
2.1.1双击打开软件,可以看到有本地和远程两种方式,然后左侧就是对应的服务,有当前计算机、还有启动的Java服务等,可以查看每个服务的运行占用内存、cpu等相关参数,我们调试程序主要关心的是线程的执行情况。如下图所示,第二张图是计算机服务、第三张图是启动的Java服务。
image.png
计算机服务
本地启动服务
2.1.2 接下来看一下如何查看线程的具体执行情况以及设计的源码追溯功能
通过上图可以看到本地服务中所有的线程及相关状态,如果线程出现问题需要排查时,需要查看具体执行的方法,那么就需要快照方式查看,具体方式如下:
点击抽样器,然后选择CPU抽样,点击停止,在点击下面的快照按钮,就可以获取所有所有线程的一次快照,然后就可以看到每个线程执行的源码,具体操作如下图:
图一.png
图二.png
展开某个线程的据图涉及源码类.png
通过上述的操作即可查看线程具体涉及的源码,从而排查问题!
2.1 远程
上面说的是本地服务监测,但是有很多情况本地服务是排查不到问题的,只有在服务器上面才能看出问题,那么我们就需要远程连接服务器上面服务,进行监控,查看具体线程的运行情况及源码分析
远程配置需要在启动Java服务的时候,在启动命令上面添加指定启动参数,这里提供的命令是正常情况下完整的启动jar包的命令,具体命令参数也很清楚,命令如下:
nohup java
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=38000
-Dcom.sun.management.jmxremote.rmi.port=38000
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=10.11.1.63
-jar app.jar &
ps:port是监控所需的端口,也就是启动服务指定的端口,但是端口要对外开放,一般的普通服务端口是不会对完开放的,这一点需要注意
hostname是对应监控的ip,我这里用的就是服务器ip,如果连接不上的情况下,可以尝试使用hostname -i
获取的对应ip,具体情况具体分析
然后启动服务之后,选中远程右键添加远程主机,输入远程主机ip后确定即可,然后选择主机ip,右键添加JMX连接,输入设定的端口号,点击确定即可,然后就可以监控远程服务器了,接下来的查看线程的情况、监控服务情况及排查问题使用快照,就和上面本地的操作一样了!
image.png
image.png
image.png
image.png
image.png
经过上述操作就可以通过JDK自带的监控软件,进行监控Java程序的运行情况以及服务器的运行情况啦!
本人原著,如有问题欢迎大家指正,共同进步!
网友评论