动易 网站首页工信部的网站备案信息查询
动易 网站首页,工信部的网站备案信息查询,山东大汉建设机械有限公司网站,网站建设手续事情是这样的#xff0c;我们项目最近应业主的要求迁移到了新的服务器#xff0c;起初一切正常#xff0c;部署、上线、测试都没有问题#xff0c;项目大概运行了一周的工作日时间都没出现问题#xff0c;直到周六那天#xff0c;项目经理打电话过来说服务器崩了#xf…事情是这样的我们项目最近应业主的要求迁移到了新的服务器起初一切正常部署、上线、测试都没有问题项目大概运行了一周的工作日时间都没出现问题直到周六那天项目经理打电话过来说服务器崩了图片上传不了验证码加载不出来等各种问题。。。然后火速连到服务器docker stats --no-stream查看了一下Docker 命令中用来显示容器资源利用情况发现这个Java服务一直在持续的上涨到15G左右正常也就几百兆以至于涨到服务器挂掉了。。。额我初步怀疑是定时任务太多的问题。 于是我马上咨询单位里经验比较丰富的大佬让我去监控一下程序的进程内存使用等情况。如果临时使用的话就让我临时处理的话就新建一个boot项目把定时任务都丢里面去构建一个jar直接在服务器里java -jar跑。这个方法可能可以维持一段时间因为本质问题还没得到解决后面还是会出问题。于是我去上网搜了一下有个JDK文件夹里叫VisualVM的工具可以实时监控。 有时候程序内存溢出或者做压力测试的时候我们就需要监控我们的程序的运行状况包括内存使用情况、CPU使用情况等等VisualVM就是监控这些数据的一个很好的工具。 下面我将教大家怎么连到Docker容器中的Java服务进行实时监控
1.修改docker-compose.yml文件
在文件中添加连接端口这里设置成1199 2.修改Dockerfile文件
添加配置 -Djava.rmi.server.hostname xxx.xxx.xxx.xxx 指定宿主机的公网ip -Dcom.sun.management.jmxremote.port xxxx 用于Java VisualVM远程监控的端口 -Dcom.sun.management.jmxremote.rmi.port xxxx 指定用于Java VisualVM远程监控的端口”需要挂载到宿主机的哪个端口 -Dcom.sun.management.jmxremote.authenticate true | false 配置是否需要验证如果true则在使用Java VisualVM连接的时候需要你认证账号密码 -Dcom.sun.management.jmxremote.ssl true | false 不指定ssl
ENV JAVA_OPTS-Djava.rmi.server.hostname192.168.1.140 -Dcom.sun.management.jmxremote.port1199 -Dcom.sun.management.jmxremote.rmi.port1199 -Dcom.sun.management.jmxremote.authenticatefalse -Dcom.sun.management.jmxremote.sslfalse或者这样 3.开放端口1199
因每个服务器都有不同的设定我这边是业主自行搭的服务器通过路由控制的需要路由那边开放1199端口。还有就是保证防火墙也给予端口开放状态否则将无法连接如果你是阿里云服务器则去阿里云资源管理中的安全组进行端口的开放。
4.尝试连接Docker中的Java服务
完成下面两个步骤即可连接 5.分析Java服务的各项指标
这里是运行9分钟的时候的截图这时CPU已经100%了不知道是软件的问题还是什么情况。 这里是运行了15小时左右的截图在这里发现了启动线程数总数2w多以及CPU占用率100%很大的概率存在内存泄漏。 6.使用mat工具分析内存溢出、内存泄露问题
软件下载安装 自行下载安装可以看这篇教程https://blog.csdn.net/wts563540/article/details/132380827 mat工具下载地址https://www.eclipse.org/mat/downloads.php
导出堆文件
如果你的 Java 应用程序是在 Docker 容器中运行的你可以通过以下步骤来获取容器内 Java 进程的 PID并使用 jmap 或 jcmd 工具获取堆 dump
获取容器内 Java 进程的 PID首先你需要进入正在运行 Java 应用程序的 Docker 容器中。你可以使用以下命令来执行一个临时的交互式 Shell以便执行后续的命令
docker exec -it container_id /bin/bash将 container_id 替换为你的容器 ID。
在容器内部获取 Java 进程的 PID在容器内部执行以下命令来获取 Java 进程的 PID
jps这将列出容器内运行的 Java 进程及其对应的进程 ID。 使用 jmap 或 jcmd 工具获取堆 dump在容器内部使用得到的 Java 进程 PID 来执行 jmap 或 jcmd命令如前面提到的那样。确保你在容器内部已经正确设置了 JDK 的环境变量并且具有足够的权限来执行这些命令。 使用 jmap 工具获取堆 dump打开命令行终端输入以下命令来获取堆 dump
jmap -dump:formatb,fileheapdump.hprof pid将 pid 替换为你要获取堆 dump 的 Java 进程的进程 ID。执行该命令后将会生成一个名为 heapdump.bin 的堆 dump 文件。
使用 jcmd 工具获取堆 dump打开命令行终端输入以下命令来获取堆 dump
jcmd pid GC.heap_dump heapdump.hprof将 pid 替换为你要获取堆 dump 的 Java 进程的进程 ID。执行该命令后同样会生成一个名为 heapdump.bin 的堆 dump 文件。 将堆 dump 文件从容器中复制到宿主机获取到堆 dump 文件后你可能希望将文件从容器中复制到宿主机上进行分析。你可以使用 docker cp 命令来实现这一点例如
docker cp container_id:/path/to/heapdump.hprof /path/on/host/heapdump.hprof其中 /path/to/heapdump.hprof 是容器内的堆 dump 文件路径/path/on/host/heapdump.hprof 是宿主机上的目标路径。
接着我们使用mat工具打开有可能会打不开。。。我暂时没找到解决办法。。。 别急还有在线版的工具来分析内存溢出、内存泄露。在线地址https://heaphero.io/heap-index.jsp#header 这个在线版也可以进行分析但是并没有mat工具那么详细 我使用这个在线版分析了我导出的堆文件导入后可以看到分析出来的结果报告下面有更详细的信息我就不展示了。 额。。。意思是这个对象被持续加载了11w个 我还在郁闷到底是谁写的那么史的代码当我打开代码看了一下发现小丑竟然是自己。。。。。。。 算了慢慢一个一个找代码看看哪里有问题吧…
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/88755.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!