Disruptor挖坑MemoryAnalyzer来填

Disruptor挖坑MemoryAnalyzer来填

    • 1、起因背景
    • 2、初步定位
    • 3、细化定位
      • 3.1、内存文件导出命令
      • 3.2、MemoryAnalyzer分析xxx.hprof文件
    • 4、思考
    • 5、花絮

1、起因背景

博主练手写的并发项目订单服务出现了程序一直处于加载未完成的状态,电脑温度升高,CPU使用率飙高,风扇狂呼,一时摸不着头脑。

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

2、初步定位

于是,采用代码回滚排查法,发现是由于bufferSize多乘以一个1024。同时断点停留在了Disruptor<OrderEntity> disruptor = new Disruptor<>(factory, bufferSize, threadPoolExecutor, ProducerType.SINGLE, new BlockingWaitStrategy());这块代码,idea的状态看起来还是运行状态,也没有报OOM
在这里插入图片描述
于是博主第一时间跟踪进去,发现了一个比较有意思的地方:
在这里插入图片描述
没错this.entries.length的值是2,097,152,也就是1024*1024*2
博主就把断点设置在this.entries[i] = eventFactory.newInstance();这一行,同时为改断点设置条件(条件断点
在这里插入图片描述
这里我们可以采用量级感知代码是否在此处循环运行:i的值可以先是100,再1000、10000、100000~~随着量级的增大满足断点的耗时也越来越长,博主曾在某个量级停留了5 ~ 10分钟。直到博主停留了一个多小时,还是没有达到断点设置的那个条件。此时,博主遭不住了,虽然代码回滚排查法+量级感知判断出了这个问题出现的地方。但是博主还不满足,博主想用数据知道是不是由于这段代码多循环创建对象导致的内存占用过大。本来想用jconsole排查,但是jconsole这种工具连不上这种未完成启动完毕状态下的程序。于是博主打算将线程在循环创建对象的内存文件导出来,再用MemoryAnalyzer分析

3、细化定位

3.1、内存文件导出命令

jps #获取java进程的pid(进程号)
jmap -dump:live,format=b,file=heap.hprof pid(进程号)

如果是在linux中的.hprof文件比较大的话,可以先压缩,再sz到windows。
博主这个文件差不多6G。

3.2、MemoryAnalyzer分析xxx.hprof文件

由于MemoryAnalyzer的配置文件MemoryAnalyzer.ini默认的内存大小配置是-Xmx1024m,所以我们6G的文件打开会报如下错误。
在这里插入图片描述
在这里插入图片描述

所以我们给10g给它:
在这里插入图片描述
现在我们可以正常打开文件了
在这里插入图片描述
在这里插入图片描述
看这堆的占用,的确有点多。
右键这个线程,看调用栈:
在这里插入图片描述
到这里,真相也就浮出水面了
在这里插入图片描述
竖型蓝色框中看到的create,<init>这些,基本就是构造方法创建对象了,还有那个fill方法,不就是我们前面提到的多循环创建对象那段代码吗;还有更准确的我们客户端调用的地方:横型蓝色框
代码行数都给你标出来了:
在这里插入图片描述
在这里插入图片描述
要到这里,真实数据也验证了我们的判断。

4、思考

  • 循环代码要着重测试循环次数
  • 出现问题擅于使用各种排查技巧,例如代码回滚排查法

5、花絮

起因背景出现的原因是博主针对Disruptor框架压测发现该框架生产了几千条数据但仅消费了几十条数据,同时后面将jemeter停止压测后手动postman发请求也只是生产数据没有消费,因此结合此次问题排查,后续会发布Disruptor框架使用误区和源码解析,以及更多的jvm内存分析和cpu使用率过高的工具介绍和分析手段。

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

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

相关文章

springboot125汽车资讯网站

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的125汽车资讯网站 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获…

springboot家乡特色推荐系统源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括家乡特色推荐的网络应用&#xff0c;在外国家乡特色推荐系统已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步阶段。家乡特色推荐系统采用java技术&#xff0…

UDS Flash刷写用例简单介绍

文章目录 1.Boot的功能1.1 目的1.2 功能 2.测试用例设计2.1 设计框架2.2 正向测试2.1.1 刷写流程2.1.2 重复刷写2.1.3压力刷写 2.3 逆向测试2.2.1 断电后刷写2.2.2 中断通讯后刷写2.2.3 篡改刷写数据2.2.4 修改软件校验数据2.2.5 修改刷写流程2.2.6 高负载刷写2.2.7 高低压刷写…

JuiceSSH结合内网穿透实现移动端设备公网远程访问Linux虚拟机

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

Linux下安装 Redis7

Linux下安装 Redis7 三、Linux下安装 Redis7【redis-7.2.4.tar.gz】3.1.下载redis的安装包3.1.1.手动下载Redis压缩包并上传【redis-7.2.4.tar.gz】3.1.2.wget工具下载redis-7.2.4.tar.gz 3.2.将安装包进行解压缩3.3.进入redis的安装包3.4.检查是否有gcc 环境3.5.编译和安装并指…

VS Code C++ 开发:入门和 IntelliSense 配置

你是否在满天星空下琢磨如何在 VS Code 中配置用于 C 开发的智能感知功能(IntelliSense)&#xff1f; 你是否想知道&#xff0c;有没有一种最简单的方法来运行你的 C 代码&#xff1f; 好消息是&#xff1a;我们在 C 扩展中添加了一些新功能&#xff0c;有了这些好东西&#xf…

Redis——关于它为什么快?使用场景?以及使用方式?为何引入多线程?

目录 1.既然redis那么快&#xff0c;为什么不用它做主数据库&#xff0c;只用它做缓存&#xff1f; 2.Redis 一般在什么场合下使用&#xff1f; 3.redis为什么这么快&#xff1f; 4.Redis为什么要引入了多线程&#xff1f; 1.既然redis那么快&#xff0c;为什么不用它做主数据…

解决Sublime Text V3.2.2中文乱码问题

目录 中文乱码出现情形通过安装插件来解决乱码问题 中文乱码出现情形 打开一个中文txt文件&#xff0c;显示乱码&#xff0c;在File->Reopen With Encoding里面找不到支持简体中文正常显示的编码选项。 通过安装插件来解决乱码问题 安装Package Control插件 打开Tool->…

Windows本地如何部署Jupyter+Notebook并结合内网穿透实现远程访问?

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中&#xff0c;使用最多的无疑就是各种函数、图表、…

2024全网超全的测试类型详解,再也不怕面试答不出来了!

在软件测试工作过程中或者在面试过程中经常会被问到一些看起来简单但是总是有些回答不上的问题&#xff0c;比如你说说“黑盒测试和白盒测试的区别&#xff1f;”&#xff0c;“你们公司做灰度测试么&#xff1f;", ”α测试和β测试有什么不一样&#xff1f;“&#xff0…

MVC模式

Model-View-Controller : 模型-视图-控制器模式&#xff0c;用于应用程序的分层开发。 Model(模型)&#xff1a;代表一个存取数据的对象。也可以带有逻辑&#xff0c;在数据变化时更新控制器。 View(视图)&#xff1a;代表模型包含的数据的可视化。 Controller(控制器)&#xf…

C/C++ - 编程语法特性

目录 标准控制台框架 输入输出对象 命名空间 标准控制台框架 头文件 ​#include <iostream>​​ 告诉编译器我们要使用iostream库尖括号中的名字指定了某个头文件(header) 入口函数 ​int main(void)​​ 返回 ​return 0;​​ 输出语句 ​std::cout << "H…

代码随想录 Leetcode111. 二叉树的最小深度

题目&#xff1a; 代码(首刷自解 2024年1月24日&#xff09;&#xff1a; class Solution { public:int minDepth(TreeNode* root) {if(root nullptr) return 0;queue<TreeNode*> que;TreeNode* cur root;que.push(cur);int size 0;int depth 0;while (!que.empty()…

力扣hot100 螺旋矩阵 模拟

Problem: 54. 螺旋矩阵 文章目录 思路&#x1f496; 收缩边界法 思路 &#x1f468;‍&#x1f3eb; 参考题解 &#x1f496; 收缩边界法 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) class Solution {public List<Integer&g…

【C++干货基地】C++入门篇:输入输出流 | 缺省函数 | 函数重载(文末送书)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

【pyqt6】用pyqt做一个点菜小程序

用pyqt做一个点菜小程序 前言1.pyqt62. 功能介绍3.程序实现 前言 在本文中&#xff0c;我们将使用 PyQt6&#xff08;Python的GUI库&#xff09;创建一个简单的点菜小程序。该程序允许用户从菜单中选择菜品&#xff0c;将其添加到订单中&#xff0c;并通过点击“下单”按钮查看…

Pandas ------ 向 Excel 文件中写入含有合并表头的数据

Pandas ------ 向 Excel 文件中写入含有合并表头的数据 推荐阅读引言正文 推荐阅读 Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据 引言 这里给大家介绍一下如何向 Excel 中写入带有合并表头的数据。 正文 import pandas as pddf1 pd.D…

嵌入式操作系统分类和任务管理

目录 嵌入式操作系统分类 1、按软件结构分类 任务管理 1、多道程序 2、进程 3、线程 4、任务 嵌入式操作系统分类 1、按软件结构分类 按照软件的体系结构&#xff0c;可以把嵌入式操作系统分为三大类:单体结构、分层结构和微内核结构。它们之间的差别主要表现在两个方面…

DL专栏—笔记目录

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要是记录工作中、学习中关于AI(Deep Learning)相关知识并分享。 &#x1f60a;&#x1f60a;&#x1f…

电脑自动开机播放PPT的解决方案

客户有个需求&#xff0c;要求与LED大屏幕连接的电脑定时自动播放PPT。为了安全电脑在不播放的时段&#xff0c;必须关机。 目录 1、使用“时控插座”并进行设置 2、戴尔电脑BIOS设置&#xff08;上电开机&#xff09; 3、设置Windows自动登录 4、任务计划设置 5、启动Au…