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

news2024/11/17 9:36:59

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

websocket逆向案例

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、案例地址二、分析流程三、逆向参数四、webSocket 交互位置总结 前言 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供…

第六篇【传奇开心果系列】Python的自动化办公库技术点案例示例:大学生数据全方位分析挖掘经典案例

传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、Pandas库全方位分析挖掘大学生数据能力介绍二、大学生学生成绩数据分析数据挖掘示例代码三、大学生选课数据分析数据挖掘示例代码四、大学生活动参与数据分析数据挖掘示例代码五、大学…

VsCode免密登录

创建本地密匙 按下WinR输入cmd&#xff0c;输入 ssh-keygen -t rsa然后连续回车直到结束 找到Your public key has been saved in C:\Users\Administrator/.ssh/id_rsa.pub&#xff0c;每个人都不一样找到密匙所在地 打开id_rsa.pub这个文件&#xff0c;可以用记事本打开&am…

Parade Series - WebRTC ( < 300 ms Low Latency ) T.B.D

Parade Series - FFMPEG (Stable X64) 延时测试秒表计时器 ini/config.ini [system] homeserver storestore\nvr.db versionV20240312001 verbosefalse[monitor] listrtsp00,rtsp01,rtsp02 timeout30000[rtsp00] schemartsp ip127.0.0.1 port8554 usr pwd context/cam08001…

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

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

在ubuntu20通过docker部署zabbix6

部署Zabbix 6.x服务器在Ubuntu 20.04 LTS系统上使用Docker的方式可以简化安装过程并实现容器化管理。以下是一个简化的步骤指南&#xff1a; 步骤1&#xff1a;安装Docker和Docker Compose 确保你的Ubuntu系统已经安装了Docker和Docker Compose。如果没有&#xff0c;请执行以…

创建SpringCloudGateWay

创建SpringCloudGateWay 本案例基于尚硅谷《谷粒商城》项目&#xff0c;视频27 创建测试API网关 1、创建module 2、引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:x…

使用Nginx进行负载均衡

什么是负载均衡 Nginx是一个高性能的开源反向代理服务器&#xff0c;也可以用作负载均衡器。通过Nginx的负载均衡功能&#xff0c;可以将流量分发到多台后端服务器上&#xff0c;实现负载均衡&#xff0c;提高系统的性能、可用性和稳定性。 如下图所示&#xff1a; Nginx负…

snowny-小诺框架-标签tabs消失不见

可能是由于&#xff0c;在配置菜单时&#xff0c;排序数字过小造成的&#xff0c;将排序数字改成大于0的数字就好使了。

ChatGPT浪潮来袭!谁先掌握,谁将领先!

任正非在接受采访时说 今后职场上只有两种人&#xff0c; 一种是熟练使用AI的人&#xff0c; 另一种是创造AI工具的人。 虽然这个现实听起来有些夸张的残酷&#xff0c; 但这就是我们必须面对的事实 &#x1f4c6; 对于我们普通人来说&#xff0c;我们需要努力成为能够掌握…

ip广播智慧工地广播喊话号角 IP网络号角在塔吊中应用 通过寻呼话筒预案广播

ip广播智慧工地广播喊话号角 IP网络号角在塔吊中应用 通过寻呼话筒预案广播 SV-704XT是深圳锐科达电子有限公司的一款壁挂式网络有源号角&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和号角喇叭输出播放&#xff0c;可达到功率50W。SV-704XT内置有…

【绩效管理】某连锁购物中心绩效考核体系搭建咨询项目

随着企业规模的扩大&#xff0c;员工数量不断增加&#xff0c;与之相关的人事管理工作的复杂性也随之增大。但是由于行业的特点&#xff0c;该购物中心的人员整体素质偏低&#xff0c;且自成立以来&#xff0c;该中心重经营轻管理&#xff0c;其人力资源管理水平也有待提升。在…

基于SpringMVC+JSP实现的亚盛汽车配件销售业绩管理统

采用技术 基于SpringSpringMVCMyBatis框架实现亚盛汽车配件销售业绩管理统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 员工端效果 进货信息 配件管理…

群晖 Synology Photos DSM7 自定义文件夹管理照片

背景 众所周知&#xff0c;目前群晖DSM7中使用Synology Photos做照片管理时&#xff0c;个人照片只能默认索引 /home/Photos 文件夹&#xff0c;但是如果个人照片很多或者用户很多时&#xff0c;共享文件夹/homes 所在的存储空间就会不够用 当然&#xff0c;如果你的存…

2024考研计算机考研复试-每日重点(第十九期)

公众号“准研计算机复试”&#xff0c;超全大佬复试资料&#xff0c;保姆级复试&#xff0c;80%的题目都是上岸大佬提供的。 研宝们&#xff0c;App更新啦&#xff01; 操作系统&#xff1a; 10.★什么是中断&#xff1f; 中断是指计算机运行过程中&#xff0c;出现某些意外时…

智慧路灯杆如何提升智慧城市文旅形象

今年以来&#xff0c;全国多地城市凭借本地独特物产、独特旅游环境等亮点火爆出圈&#xff0c;为城市带来显著经济增长和形象提升。文旅经济作为高附加值产业&#xff0c;具有高收益、高潜力等特点&#xff0c;还有助于推动城市经济转型和可持续发展。 推动城市文旅经济发展&am…

基于C++的一种字符串切分方法及示例代码

一、概述 在 Java 和 python 中&#xff0c;都有实现字符串切分的方法&#xff0c; 如split() &#xff0c;使用起来较为方便&#xff0c;但是在标准的 C 中&#xff0c;却没有内置的 split() 方法。 我们可以使用标准库中的一些函数和方法来实现字符串的切分&#xff0c;这里…

【报错 - npm包问题】 token.type.endsWith is not a function

将 babel-eslint 10.1.0版本&#xff0c;降为 8.2.2 npm install babel-eslint8.2.2 --save

数据结构02:线性表 顺序表习题01[C++]

图源&#xff1a;文心一言 考研笔记整理~&#x1f95d;&#x1f95d; 之前的博文链接在此&#xff1a;数据结构02&#xff1a;线性表[顺序表链表]_线性链表-CSDN博客~&#x1f95d;&#x1f95d; 本篇作为线性表的代码补充&#xff0c;供小伙伴们参考~&#x1f95d;&#x1…

如何使用“Docker registry创建本地仓库,在服务器之间进行文件push和pull”?

1.1、在服务器1&#xff0c;运行registry docker run -d -p 5000:5000 -v ${PWD}/registry:/var/lib/registry --restart always --name registry registry:2.7.11.2、编辑/etc/docker/daemon.json 文件&#xff0c; 192.168.xxx.xxx 换成你自己 registry 服务的地址 sudo na…