使用Java自带的VisualVM监控远程服务器部署在Docker容器中的Java项目并使用Mat在线工具排查服务器内存泄露或内存溢出的原因

事情是这样的,我们项目最近应业主的要求迁移到了新的服务器,起初一切正常,部署、上线、测试都没有问题,项目大概运行了一周的工作日时间都没出现问题,直到周六那天,项目经理打电话过来说服务器崩了,图片上传不了,验证码加载不出来等各种问题。。。然后火速连到服务器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.hostname=192.168.1.140 -Dcom.sun.management.jmxremote.port=1199 -Dcom.sun.management.jmxremote.rmi.port=1199 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"

在这里插入图片描述

或者这样

在这里插入图片描述

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:format=b,file=heapdump.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.hqwc.cn/news/537349.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是芯片底部填充胶,它有什么特点?

什么是芯片底部填充胶&#xff0c;它有什么特点&#xff1f; 芯片底部填充胶是一种用于电子封装的胶水&#xff0c;主要用于底部填充bga芯片电子组件&#xff0c;以增强组件的可靠性和稳定性。它通常是一种环氧树脂&#xff0c;具有良好的粘接性和耐热性。 底部填充胶的特点主要…

锐科达高速公路智慧隧道应急通讯网络广播解决方案

锐科达高速公路智慧隧道应急通讯网络广播解决方案 我国已是世界上公路隧道里程最长、规模最大、发展最快的国家。面对数量庞大的公路隧道&#xff0c;如何严防在隧道内发生重特大交通安全事故以及保障发生紧急情况下的应急通讯&#xff0c;是各地交通运输主管部门、各级指挥中心…

Spring具体拓展点:后置处理器

一图胜千言 mermaid示例图&#xff1a; #mermaid-svg-YEqFb5JcEk5FWkwO {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YEqFb5JcEk5FWkwO .error-icon{fill:#552222;}#mermaid-svg-YEqFb5JcEk5FWkwO .error-text{fi…

获取京东商品评论API测试指南(jd.item_review)

item_review-获得JD商品评论 API测试结果展示 获取API测试密钥 商品评论页原数据 API参数说明 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求…

Spring Security 结合 JWT使用

Spring Security原理 Spring Security的原理主要基于过滤器链的概念。在Web应用程序中&#xff0c;每个请求都会通过一系列的过滤器&#xff0c;Spring Security就是在这个过程中介入并进行安全相关的操作。 Spring Security的核心原理可以概括为以下几点&#xff1a; 1. 认…

查看docker安装MySQL版本

要查看Docker中安装的MySQL版本&#xff0c;您可以按照以下步骤操作&#xff1a; 首先确保您有一个正在运行的MySQL Docker容器。如果尚未启动MySQL容器&#xff0c;请使用类似下面的命令启动它&#xff08;假设已经从Docker Hub拉取了镜像&#xff09;&#xff1a; docker run…

JAVA基础—集合详细解析

1.JAVA中的4种集合类型 Set&#xff1a;无序、不可重复的集合List&#xff1a;有序、重复的集合Queue&#xff1a; 队列Map&#xff1a;映射关系 首先&#xff0c;JAVA的集合类主要有两个接口派生而出&#xff1a;Collection和Map。Collection和Map就是JAVA集合的根接口。所以后…

HertzBeat开源监控系统

一、官网 中文官网 GitHub地址 二、安装 docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat tancloud/hertzbeat还有其他的安装方式 三、登陆方式 浏览器访问 http://localhost:1157 即可开始&#xff0c;默认账号密码 admin/hertzbeat 四、监控接入 一、docke…

数字化转型导师坚鹏:金融机构数字化运营

金融机构数字化运营 课程背景&#xff1a; 很多金融机构存在以下问题&#xff1a; 不清楚数字化运营对金融机构发展有什么影响&#xff1f; 不知道如何提升金融机构数字化运营能力&#xff1f; 不知道金融机构如何开展数字化运营工作&#xff1f; 课程特色&#xff1a;…

第10集《天台教观纲宗》

请大家打开讲义第十七页。我们讲到己二、结申正义。 己二、结申正义 《法华经》把我们修行人修行的相貌&#xff0c;比喻作一个车乘。车乘就是一种交通工具&#xff0c;它能够让我们从此岸超越到彼岸去。所以修行它是可以超越的&#xff0c;你今天比昨天超越了&#xff0c;就好…

“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用教程

原文链接&#xff1a;“SRP模型”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597452&idx5&snf723d9e5858a269d00e15dbe2c7d3dc0&chksmfa823c6…

力扣串题:字符串中的第一个唯一字母

映射做法&#xff1a;将字母转为数字之类的转化必须在运算中实现如-a int firstUniqChar(char * s){int a[26] {0};int len strlen(s);int i;for (i 0; i < len; i)a[s[i] - a];for (i 0; i < len; i) {if (a[s[i] - a] 1)return i;}return -1; }