【开发篇】一、内存泄漏的分析工具

文章目录

  • 1、内存泄漏
  • 2、解决内存泄漏
  • 3、工具一:Top
  • 4、工具二:VisualVM
  • 5、工具三:阿尔萨斯Arthas
  • 6、工具四:Promethus + Grafana
  • 7、图像分析

1、内存泄漏

一个对象不再使用后,(因其从GC Root仍有引用链可达)却未被JVM回收,白白占着内存,即内存泄漏,这个效果累积,最后就会OOM。

在这里插入图片描述

在这里插入图片描述

2、解决内存泄漏

  • 发现:设置监控告警,内存占用超过阈值就发送警告邮件

  • 诊断:借助分析工具

  • 修复:修复代码或做设计方案调整

  • 验证

3、工具一:Top

Linux下:

top

在这里插入图片描述

相关项:

  • load average:4.77、3.34、2.59 三个值分别是过去1分钟、5分钟、15分钟的系统负载
  • PID:进程号(和ps、jps等的结果一样)
  • VIRT:虚拟内存,不用关注
  • RES:常驻内存,即当前进程使用了多少内存
  • SHR:共享内存,比如进程运行过程中依赖的一些第三方库,操作系统只需加载一次,就可在多个进程间共享
  • RES数值里包含了SHR,因此平时计算需要RES - SHR才是当前进程真正的占用
  • %MEM即进程使用的内存占实际可用的物理内存的比例
  • TIME+ 启动依赖占用的CPU的时间
  • COMMAND:启动命令
  • 默认按CPU使用率排序,更换排序可在top运行过程中输入M(大写状态下M)

top只适合做一个初步的筛查,判断问题在哪个进程。

4、工具二:VisualVM

可视化分析工具,Oracle JDK 6~8 中自带,双击运行:

在这里插入图片描述

Oracle JDK 9之后需要单独安装,下载地址:https://visualvm.github.io/

在这里插入图片描述

本地启动Visual VM:

解压即可使用,双击启动:

在这里插入图片描述

这里展示了当前本地启动的Java进程:

在这里插入图片描述

切换到Monitor监控tab页,这里有CPU、堆、元空间、类、线程,可勾选要展示和监控的内容:

在这里插入图片描述

看下整体信息,正常展示了我在IDEA加的启动JVM参数:

在这里插入图片描述

查看堆和元空间的走向:这里有size向max扩容的知识点,别看到高的线就认为空间不足

在这里插入图片描述

IDEA的插件版的Visual VM:

在这里插入图片描述

安装完成后,再次setting-> Other Setting,选择exe的目录:

在这里插入图片描述

此时的这两个按钮,就等于普通的debug / run 再加一个启动Visual VM:

在这里插入图片描述

点击启动程序,直接打开Visual VM,并定位到这个进程。

Visual VM远程监控线上服务:

以上为本地的监控,如果是远程线上服务的监控,需要添加JVM参数:

java -jar
-Djava.rmi.server.hostname=10.4.134.198  //hostname为远程主机地址
-Dcom.sun.management.jmxremote //开启jmx远程访问的功能
-Dcom.sun.management.jmxremote.port=80  //设置jmx远程访问的端口号,比如9122
-Dcom.sun.management.jmxremote.rmi.port=80
-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false //关掉ssl以及认证这两个安全与权限的认证
demo-0.0.1.jar

打开jmx,选远程,右键Add Remote Host:

在这里插入图片描述
在这里插入图片描述
右键Add JMX Connection:

在这里插入图片描述
加上前面的端口:

在这里插入图片描述

监控成功:

在这里插入图片描述

但不建议给生产环境用,因为要保证生产环境的稳定,而Full GC和Heap Dump生成内存快照的这两个功能会停止用户线程。还有,如果是集群化部署,不是上面的java -jar一个jar包,远程就很不方便。

在这里插入图片描述

//连接远程踩坑帖子
https://blog.csdn.net/qq_27641935/article/details/102919542

5、工具三:阿尔萨斯Arthas

微服务架构下,在每个pod里去启动Arthas很繁琐(当然临时排查一下某单个服务的话这样也挺好),可以使用Arthas的tunnel管理所有的需要监控的服务。实现步骤:

  • 微服务pom中添加arthas的起步依赖(有公共的common模块的话,扔common也行)

在这里插入图片描述

  • 写arthas的配置

在这里插入图片描述

  • 在某服务器上启动tunnel服务端程序,各个微服务间http端口号和telnet远程连接端口号不要重复
//tunnel服务端jar是是一个Spring Boot插件打的jar,可直接启动
//-Darthas.enable-detail-pages=true参数,让tunnel提供一个页面供我们去看注册上来的应用,默认8080端口访问
nohup java -jar -Darthas.enable-detail-pages=true arthas-tunnel-server-3.7.1-fatjar.jar &
  • 重启微服务
  • 访问tunnel页面,查看所有进程并进行arthas的操作

在这里插入图片描述

Arthas的tunnel(隧道),适用于生产、测试环境下,管理微服务的集群。

//见鬼,为什么-Dserver.port=8081会端口占用,--server.port=8081就没事
-Dserver.port=8081
--server.port=8081

6、工具四:Promethus + Grafana

Promethus收集应用的数据,Grafann以可视化方式展示。首先需要微服务中引入actuator,以http的方式将服务对应的指标向外暴露,以便Promethus收集

在这里插入图片描述
配置:
在这里插入图片描述
再引入另一依赖:micrometer,将JVM、数据库连接池的信息、磁盘信息等收集上来,组装成Prometheus能识别的格式

在这里插入图片描述
在这里插入图片描述

调接口看下暴露出来的promethues相关的端点信息

在这里插入图片描述

再往后就是Promethues的部署、连接了。略了。

7、图像分析

正常的堆内存变化图:

在这里插入图片描述

特点:

  • 上下起伏,创建对象频繁时会升高,Young GC后会下降
  • Full GC后骤降,且降完后的值和之前接近(这就说明这段时间内没有产生不可被回收的对象,即没有内存泄漏)
  • 长时间看,整条线在一个区间内上下波动,而不是逐渐上升

有内存泄漏的堆内存变化图:

在这里插入图片描述

特点:

  • 持续增长,YounGC也不会降太多
  • 两次Full GC的内存量有落差
  • 长远看,整体占用量一直在上升

最后,可以使用Visual VM的采样tab页,查看当前堆里的对象信息。点Perform GC来Full GC,发现这块空间一直不能降,大概率问题就在这儿。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/615915.shtml

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

相关文章

2023下半年软考证书什么时候发放?怎么领取?

已经确定领取时间的地区: 广东: 电子版:2024年1月8日上线 纸质版:预计24年2月开始 重庆: 邮寄申领:2024年1月15日0:00-3月1日23:00 现场领取:2024年1月15日-2月7日 贵州: 邮…

vue Element Plus Cascader级联选择器点击标签选中复选框

element-plus原功能 element-plus的Cascader级联选择器点击标签时是不会选中复选框的,我们想要实现点击标签时也能选中复选框这个效果,那么就要用到一些原生的方法 实现效果 mounted() {// Cascader 级联选择器: 点击文本就让它自动点击前面的input就可…

PPT自动化处理

python-pptx模块 可以创建、修改PPT(.pptx)文件非Python标准模块,需要单独安装 在线安装方式 pip install python-pptx 读取slide幻灯片 .slides 获取shape形状 slide.shapes 判断一个shape中是否存在文字 shape.has_text_frame 获取文字框 shape.text_f…

记录汇川:H5U与Fctory IO测试10

主程序: 子程序: IO映射 子程序: 自动程序 Fctory IO配置: HMI配置: 实际动作如下: Fctory IO测试10

Java Websocket发送文件给Vue客户端接收并上传,实现检测U盘插入并将指定文件上传到服务器功能

应用环境: B/S架构 需求描述: 1、判断U盘接入 2、扫描U盘指定文件,将满足条件的文件发送给服务器 解决思路: 1、因为bs架构,无法获取本机资源,计划在U盘所在服务器部署websocket服务 2、websocket服务扫描u…

C# 快速模指数运算 快速求余运算

此方法解决这样一个问题,就是a^b mod m 的余数是多少。 如果直接计算a^b,方次很大的时候,会溢出,而且时间很长。 当然指数很小的时候直接用自带的Math函数就行,如果指数很大的时候,可以用以下的方法。 原…

提升源代码安全性的C#和Java深度混淆工具——IpaGuard

保护C#|JAVA源代码的深度混淆工具——IpaGuard 摘要 Ipa Guard是一款功能强大的IPA混淆工具,通过对iOS IPA文件进行混淆加密,保护其代码、资源和配置文件,降低破解反编译难度。本文将介绍Ipa Guard的深度混淆技术,包括逻辑混淆、…

白学的小知识[node.ji三大模块]

1. http模块:http模块是Node.js官方提供的用来创建HTTP服务器和客户端的模块。它提供了一系列的方法和属性,用来满足用户对HTTP通信的需求。例如,可以使用http模块创建一个简单的HTTP服务器,监听指定的端口,并处理请求…

世微AP5125 输入14-80V 输出12V5A LED灯降压恒流电源驱动方案 SOT23-6

这是一款60WLED驱动方案,线路图BOM表如下 ​ 祥单表: 实物图: 产品描述 AP5125 是一款外围电路简单的 Buck 型平均电流检测模式的 LED 恒流驱动器,适用于 8-100V 电压范围的非隔离式大功率恒流 LED 驱动领域。芯片采用固定频率 140kHz 的 …

【Spring Boot】application 配置文件(2)

server.servlet.session.timeout1800 spring.jackson.time-zoneGMT8 spring.jackson.date-formatyyyy-MM-dd HH:mm:ss server.servlet.session.timeout1800 定义了 HTTP 会话的超时时间,单位是秒,在此设置中,会话的超时时间被设置为 1800秒 即…

element + table 行列合并

如图&#xff0c;实现通过判断数据&#xff0c;动态的合并列数据 <template><div class"merge-cell"><el-table:data"tableData":span-method"objectSpanMethod"borderstyle"width: 100%; margin-top: 20px"><e…

thinkadmin笔记

Db::name(huanggou)->where(id,$arra[dashou_id])->inc(num_read

记录el-select+el-tree复选框,支持模糊查询,懒加载,树父子节点不关联,不全选

需求&#xff1a;一个机构下拉菜单&#xff0c;一个人员下拉菜单&#xff0c;默认带入当前登录用户的机构和人员。机构下拉菜单为两个接口&#xff0c;模糊查询为一个接口不包含懒加载&#xff0c;默认非模糊查询情况下为一个接口&#xff0c;点击节点懒加载。机构下拉菜单数据…

计算机网络+线性代数+大学物理

前言 不加湘潭大学的tag&#xff0c;防止曝光率太高哈哈 计算机网络 选择题确定的是5个题&#xff0c;填空题确定的是2个题&#xff0c;简答题前两个确定&#xff0c;然后就没有了&#xff0c;27&#xff0b;62&#xff0c;26&#xff0b;&#xff0c;确实是比较难&#xff…

【STM32】HAL库的STOP低功耗模式UART串口唤醒,解决首字节出错的问题(全网第一解决方案)

【STM32】HAL库的STOP低功耗模式UART串口唤醒&#xff0c;解决首字节出错的问题&#xff08;全网第一解决方案&#xff09; 前文&#xff1a; 【STM32】HAL库的STOP低功耗模式UART串口唤醒&#xff0c;第一个接收字节出错的问题&#xff08;疑难杂症&#xff09; 目前已解决 …

docker swarm 常用命令简介以及使用案例

docker swarm Docker Swarm 是Docker官⽅的跨节点的容器编排⼯具。⽤户只需要在单⼀的管理节点上操作&#xff0c;即可管理集群下的所有节点和容器 解决的问题 解决docker server的集群化管理和部署Swarm通过对Docker宿主机上添加的标签信息来将宿主机资源进⾏细粒度分区&am…

LoadBalancer 替换 Ribbon

POM 移除 Ribbon 相关依赖 <!-- LoadBalancer 必须引入 springcloud --> <!-- 父pom引入springcloud 版本管理 --> https://spring.io/projects/spring-cloud/ 官网查看 boot 对应的 cloud 的版本 <dependencyManagement><dependency> <groupI…

【源码阅读】事件订阅包v2

1、Feed Feed 实现一对多订阅&#xff0c;其中事件的载体是通道。发送到 Feed 的值会同时传送到所有订阅的通道。 与Typemux的对比 链接: link TypeMux是一个同步的事件框架&#xff0c;当有一个被订阅的事件发生的时候&#xff0c;会遍历该事件对应的订阅者通道&#xff0c;…

redis源码之:事件驱动epoll

一、aeEventLoop初始化 从server.c的main方法中进入initServer&#xff0c;在initServer方法中&#xff0c;server.el aeCreateEventLoop(server.maxclientsCONFIG_FDSET_INCR);创建eventloop&#xff1a;&#xff08;注意fileevent与epollevent的区分fileEvent是标识往epoll…

day13 滑动窗口最大值 前K个高频元素

题目1&#xff1a;239 滑动窗口最大值 题目链接&#xff1a;239 滑动窗口最大值 题意 长度为K的滑动窗口从整数数组的最左侧移动到最右侧&#xff0c;每次只移动1位&#xff0c;求滑动窗口中的最大值 不能使用优先级队列&#xff0c;如果使用大顶堆&#xff0c;最终要pop的…