【开发篇】六、查询大量数据导致内存溢出

文章目录

  • 1、溢出场景
  • 2、快照文件分析
  • 3、本地环境复现
  • 4、结论
  • 5、解决思路

记录一个问题,工作中有个数据处理服务OOM,查了下镜像的dockerfile,发现JVM参数如下。很明显,一个数据服务,里面经手大量的数据对象,堆内存125的设置肯定不合理,调大至512m解决。

在这里插入图片描述

重装了Jmeter,遇到几个问题:

  • 安装

  • 打开文件报错

  • 解析xml报错

继续看文章微服务的内存问题。

1、溢出场景

在这里插入图片描述

文章微服务,在业务高峰期发生内存溢出。

2、快照文件分析

分析生产环境内存溢出时的JVM快照文件(hprof文件),发现com.mysql.cj.jdbc.result.ResultSetImpl是MAT的怀疑对象,而ResultSetImpl即MySQL查询返回结果的包装对象,因此想到可能是大量从数据库查询的结果保存在内存中,导致JVM内存溢出。

在这里插入图片描述

打开直方图和支配树,按照深堆倒叙排序,发现String对象、文章实体类对象TbArticle、ResultSetImpl对象排名靠前:

在这里插入图片描述

从当前线程入手,找到处理器方法HandlerMethod,List objects --> with outgoing references查看其关联的对象,在description中方找到当前线程在执行哪个方法

- with outgoing references:当前对象引用了哪些对象
- with incoming references:当前对象被哪些对象引用

在这里插入图片描述

找到了有问题的类和方法:

在这里插入图片描述

3、本地环境复现

造数据10w:

CREATE PROCEDURE generate_test_data()
BEGINDECLARE i INT DEFAULT 1;WHILE i <= 100000 DOINSERT INTO article  (title,content) VALUES (CONCAT('string', i),SUBSTRING(MD5(RAND()), 1, 50));SET i = i + 1;END WHILE;
END;CALL generate_test_data();DROP PROCEDURE generate_test_data;select COUNT(*) from article a ; 

设置JVM参数:

-Xmx100m -Xms100m  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/jvm/heapdemo.hprof

Jmeter模拟业务高峰:

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

内存溢出,分析快照文件:

在这里插入图片描述

4、结论

堆内存快照中的怀疑对象代码,此处只是一个简单的查询:service层调mapper,做一个简单的select *

@GetMappingpublic ResponseEntity<Page<TbArticle>> queryByPage(TbArticle tbArticle, int page,int size) {return ResponseEntity.ok(this.articleService.queryByPage(tbArticle, PageRequest.of(page,size)));}

分页结果查询的条数太大,并且单条数据的对象也很大,如此,业务高峰期,JVM内存保存了大量的对象,导致内存溢出。

5、解决思路

  • 限制单次最大访问条数
  • 分页接口如果只是展示文章列表,就不要把最大的内容字段content也返回,以减少每个对象的大小
  • 整合sentinel,高峰期限流

思路一最合理,修改代码,让最大条数为100:

/*** 分页查询** @param tbArticle 筛选条件* @return 查询结果*/
@GetMapping
public ResponseEntity<Page<TbArticle>> queryByPage(TbArticle tbArticle, int page, int size) {size = Math.min(100, size);return ResponseEntity.ok(this.articleService.queryByPage(tbArticle, PageRequest.of(page, size)));
}

本地启动Visual,Jmeter模拟并发,发现JVM内存在100M下也够用,图中每次的下调,代表的就是一次查询结束,不用的对象被回收:

在这里插入图片描述

Jmeter压测表现平稳:

在这里插入图片描述

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

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

相关文章

el-table 表格中插入表单循环校验

<template><div>{{form}}<el-form :model"form" ref"form"><el-form-item label"呃呃呃呃呃呃呃"><el-table :data"tableData" border><el-table-column prop"time" label"日期"…

JavaWeb项目——MVC架构框架

表现层&#xff08;UI&#xff09;&#xff1a;直接跟前端打交互&#xff08;一是接收前端ajax请求&#xff0c;二是返回json数据给前端&#xff09;业务逻辑层&#xff08;BLL&#xff09;&#xff1a;一是处理表现层转发过来的前端请求&#xff08;也就是具体业务&#xff09…

回溯组合求和算法---去重

给定一个数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明&#xff1a; 所有数字&#xff08;包括目标数&#xff09;都是正整数。解集不能包含重复的组合。 …

Ollama部署马斯克Grok-1模型

llama.cpp支持 近日llama.cpp添加了对grok-1模型的支持。 PR 6404 GGUF模型 并且在Hugging Face上有大佬放出了Grok-1的非官方GGUF量化模型。 目前可供下载的量化模型: Ollama支持 在ollama官网&#xff0c;有大佬也已经上传了Grok-1模型。 资源充足的各位可以选择适合自…

【C++】详解 to_string 与 to_stoi 函数(整数转字符串-字符串转整数)

目录 一、前言 二、什么是 to_string - to_stoi 三、to_string ✨作用 ✨测试代码&#xff1a; 四、to_stoi ✨作用 ✨测试代码&#xff1a; 五、力扣常考面试题 ✨ 例题 1 ✨例题 2 六、共勉 一、前言 想必大家在做 LeetCode 算法题的时候会经常看到有使用 to_string 和…

Linux(centos7)部署hadoop集群

部署环境要求:已完成JDK环境部署、配置完成固定IP、SSH免费登录、防火墙关闭等。 1、下载、上传主机 官网:https://hadoop.apache.org 2、解压缩、创建软连接 解压: tar -zxvf hadoop-3.3.6.tar.gz软连接: ln -s /usr/local/apps/hadoop-3.3.6 hadoop3、文件配置 hadoo…

【分解定理】分解定理I、II、III

分解定理I 设&#xff0c;则 设&#xff0c;则 分解定理II 设&#xff0c;则 设&#xff0c;则 分解定理III 设&#xff0c;集值映射 且对任意的&#xff0c;有&#xff0c;则 1. 2.设&#xff0c;若&#xff0c;则 3.若&#xff0c;则&#xff1b;若&#xff0c;则 小结…

微信支付服务商处理消费者投诉管理,支持多服务商

大家好&#xff0c;我是小悟 1、问题背景 玩过微信支付生态的&#xff0c;或许就有这种感受&#xff0c;如果收到投诉单&#xff0c;不会通知到手机端&#xff0c;在服务商模式下&#xff0c;只会在微信支付服务商平台-合作伙伴功能-投诉处理那里显示。那你能一直盯着电脑看吗…

nandgame中的寄存器

只有当st and cl 1时&#xff0c;d0 d1的数据通路才会打通。 修改为&#xff1a;st决定通路是否联通&#xff0c;cl从0到1决定一次赋值&#xff08;数据传递&#xff09;。

Linux——进程程序替换

替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数 以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动 例程开始执行。调用exec并不创建新进程,所以调用…

RWTH-PHOENIX Weather数据集模型说明和下载

RWTH-PHOENIX Weather 2014 T数据集说明: 德国公共电视台PHOENIX在三年内(2009 年至 2011 年) 录制了配有手语翻译的每日新闻和天气预报节目,并使用注释符号转录了 386 个版本的天气预报。 此外,我们使用自动语音识别和手动清理来转录原始德语语音。因此,该语料库允许训练…

Blast Layer2集成Covalent数据集,提升以太坊dApps拓展能力

Covalent Network&#xff08;CQT&#xff09; 作为行业领先的多链索引器&#xff0c;正着手与 Blast 进行一项激动人心的合作。Blast 是一个独特的 Layer2 扩展方案&#xff0c;旨在解决以太坊网络所面临的可扩展性挑战。目前&#xff0c;Covalent Network&#xff08;CQT&…

期货开户的几个阶段和境界

期市论剑&#xff0c;谁是英雄&#xff0c;每个在期货市场上的人们无时不刻不在努力成为市场上的高手之列&#xff0c;可是期货市场和经济原理是一样的&#xff0c;市场上的人们依水平高低从上至下以金宝塔式排列&#xff0c;利益则成倒倒金字塔排列&#xff0c;也就是塔尖上的…

ensp中pc机访问不同网络的服务器

拓扑图如下&#xff0c;资源已上传 说明&#xff1a;pc通过2个路由访问server服务器 三条线路分别是192.168.1.0网段&#xff0c;192.168.2.0网段和192.168.3.0网段&#xff0c;在未配置的情况下&#xff0c;pc设备是访问不到server的 具体操作流程 第一&#xff1b;pc设备…

企业微信更改主体的怎么进行线上公证?

企业微信变更主体有什么作用&#xff1f; 做过企业运营的小伙伴都知道&#xff0c;很多时候经常会遇到现有的企业需要注销&#xff0c;切换成新的企业进行经营的情况&#xff0c;但是原来企业申请的企业微信上面却积累了很多客户&#xff0c;肯定不能直接丢弃&#xff0c;所以这…

HCIA-Datacom H12-811 题库补充(3/26)

完整题库及答案解析&#xff0c;请直接扫描上方二维码&#xff0c;持续更新中 管理员想要彻底删除旧的设备配置文件<config.zip>&#xff0c;则下面的命令正确的是() A&#xff1a;reset config.zip B&#xff1a;delete/unreserved config.zip C&#xff1a;clear co…

element ui的下拉选择单选和多选

单选&#xff1a; html代码&#xff1a; <el-form-item label"指令分类: "><el-select v-model"cid" style"width:100%;" placeholder"请选择指令分类" clearable><el-option v-for"item in orderCidList"…

基于深度学习的海洋鱼类识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ............................................................ % 对测试集进行分类预测 [Pr…

谷歌AI搜索惊现恶意网站推荐!用户安全再遭威胁?

近日&#xff0c;谷歌推出的新搜索生成体验(SGE)功能引发广泛关注。然而&#xff0c;这一旨在提升搜索体验的AI功能却陷入了争议&#xff0c;有报道称其可能在生成的响应中推广欺诈网站和恶意软件&#xff0c;为用户带来安全风险。 AI-321 | 专注于AI工具分享的网站 AI工具集 …

云电脑火爆出圈,如何选择和使用?--腾讯云、ToDesk云电脑、青椒云使用评测和攻略

前言&#xff1a; Hello大家好&#xff0c;我是Dream。在当下&#xff0c;科技的飞速发展已经深入影响着我们的日常生活&#xff0c;特别是随着物联网的兴起和5G网络的普及&#xff0c;云计算作为一个重要的技术概念也逐渐走进了我们的视野。云计算早已不再是一个陌生的名词&am…