经典内存泄漏问题

引言       

        很久没有写文章了,因为也没在继续写项目,也很难遇到一些技术问题,其实最主要的是懒得去写了。

        这是我第二次实习,但真正意义上算得上是第一次,我发现工作和个人开发还是有很大不同,个人开发追求的是极致的技术,要的是登上山顶的高度;而工作追求的是你能不能到达某个点,且会有很多限制,让你限制住一些腿脚,这不太舒服,但是也比较考验项目解决能力。所以开了这个专栏,来记录一些工作中遇到的问题。

需求介绍

        这个背景也是蛮离谱,由于客户的内网策略导致无法访问 目标外网的任何资源,由于服务器资源也难以申请,也不能使用数据库等任何第三方,而且这是一个长连接(响应时间长会导致生产环境下触发超时策略)。那么我就只能这样设计,前端调后端接口带一个UUID,后端请求第三方api,把得到的数据及 UUID 作为 Key 存到内存里,然后前端拿着这个 uuid 去轮询,这样好像就万事大吉了。经理给我构思的也是这样,但是很明显这让我想到了,"内存泄漏",以前总是很难理解,只是记住定义:内存无法释放的情况是内存泄漏。

        虽然我自己写的项目也有些深度,但确实很难遇到内存泄漏的情况,因为基本三段式的开发架构,请求都是无状态的,websocket会涉及到,但由于连接有自己的生命周期,可以直接挂载到其生命周期上就可以请以完成内存清理。

        编程语言用的C#,java里的弱引用等等概念,我也不清楚.NET里有还是没有,这时候算法就派上用场了,我写代码依赖基本第一次深刻意识到算法的使用场景。

设计实现

        存储这个数据肯定用map,因为这是典型的key-value结构,key存储uuid,value存储数据,前端带着uuid 发起请求,再轮询去请求,如果有数据就拿出来,删掉。但是这个系统它是无数据存储的,假如我点击生成数据之后,刷新页面就会导致 什么情况呢? 只生产不销售,这肯定会导致愈积愈多,光靠读完就删的策略肯定不够。

        然后我就想要不这样,设置一个MAX容量,等容器超过MAX后,就删一个,可是啊map并未给你提供这个功能,接下来需要引用维护一个队列去保证,每次删掉的都是最旧的数据,这样可以基本保证数据可用。由于链表只存储一个uuid,内存占用很小,不对它进行维护。

        刚开始,我这样设计:

  1. 当请求生成数据时,链表里存uuid,map里存uuid和数据;当添加完后,容量超出就取出queue的队尾元素,然后让map根据这个元素删值
  2. 当轮询时,轮询到了就根据删map

这个好像看起来天衣无缝,但这只只建立在map和queue数据同步的情况,由于只要生成queue里就会有数据,但删除queue的元素又是个棘手的问题(需要遍历),看起来乱七八糟,我写到这里也是混乱,那么就展开分析。

        一共三种情况:

  1. 正常情况,正常存,正常取,map不变,queue多一数据
  2. 异常情况,正常存,不取,map + 1,queue也 + 1

所以queue一定会处于多于map的情况,而且是一直是这样,相当于map是queue的子集,所以删的每一个map的时候,可能会发生空删,但一定能删到,比如有下面一组数据。

[{1, null},{2, null},{3, null},{4, null},{5, null}]

[8, 3, 2, 4, 6, 1,5]

设置内存上限为5,现在要存一个{6, null},存完之后触发删除逻辑,拿出队尾元素,8去找map(O1复杂度),找不到,发生了空删,这时判断如果没有删到数据就接着删,直到有实际意义的删到,这样一来便削减了map的容量,实现了自动化,空间和时间复杂度耗费都较小。

        这时就有人问了,你这肯定不对啊,那最坏情况,没人在生成数据的时候刷新,你这不是queue无限大了,map永远触发不了削减。是这样,但queue天生支持按时间顺序丢弃元素避免内存泄漏,当queue超过指定容量,直接弹出队尾元素即可。

        本节完毕,由于这个需求过去了有段时间,所以语言表达可能不是很完善,望谅解。

        

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

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

相关文章

DeepSeek集成到VScode工具,让编程更高效

DeepSeek与VScode的强强联合,为编程效率树立了新标杆。 DeepSeek,一款卓越的代码搜索引擎,以其精准的索引和高速的检索能力,助力开发者在浩瀚的代码海洋中迅速定位关键信息。 集成至VScode后,开发者无需离开熟悉的编辑…

RAG组件:向量数据库(Milvus)

在当前大模型盛行的时代,大模型的垂类微调、优化成为产业落地、行业应用的关键;RAG技术应运而生,主要解决大模型对专业知识、实效性知识欠缺的问题; RAG的核心工作逻辑是将专业知识、实效知识等大模型欠缺的知识进行收集、打包、保…

2022java面试总结,1000道(集合+JVM+并发编程+Spring+Mybatis)的Java高频面试题

1、面试题模块汇总 面试题包括以下十九个模块: Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示…

英码科技携昇腾DeepSeek大模型一体机亮相第三届北京人工智能产业创新发展大会

2025年2月28日,第三届北京人工智能产业创新发展大会在国家会议中心隆重开幕。本届大会以"好用、易用、愿用——以突破性创新加速AI赋能千行百业”为主题,重点展示人工智能技术创新成果与产业化应用实践。作为昇腾生态的APN伙伴,英码科技…

(链表 删除链表的倒数第N个结点)leetcode 19

设空结点指向head便于插入和删除结点 考虑特殊情况 head结点被删除 a结点仅用来测试长度,找到目标结点的位置 b结点为空结点指向head返回值 cur用来删除目标值(特殊情况 目标值为head 这时curb) 则开始就将cur初始化为b开始遍历 /*** Definition fo…

Android Studio 新版本Gradle发布本地Maven仓库示例

发布代码到JitPack示例:https://blog.csdn.net/loutengyuan/article/details/145938967 以下是基于 Android Studio 24.2.2(Gradle 8.10.2 AGP 8.8.0 JDK17) 的本地 Maven 仓库发布示例,包含aar和jar的不同配置: 1.…

[今年毕业设计]最新最全最有创意的基于云计算的计算机专业毕设选题精选推荐汇总建议收藏!!

文章目录 前言基于云计算的毕业设计选题毕设作品展示 前言 2025全新毕业设计项目 💗博主介绍:✌全网粉丝10W,CSDN全栈领域优质创作者,博客之星、掘金/华为云/阿里云等平台优质作者。 👇🏻 精彩专栏 推荐订阅&#x1f4…

coze生成的工作流,发布后,利用cmd命令行执行。可以定时发日报,周报等。让他总结你飞书里面的表格。都可以

coze生成的工作流,发布后,利用cmd命令行执行。可以定时发日报,周报等。让他总结你飞书里面的表格。都可以。 很简单。 准备工作,先发布你的工作流,和发布应用。 然后,点击扣子API 。 申请一个&#xff0…

安防监控/视频集中存储EasyCVR视频汇聚平台如何配置AI智能分析平台的接入?

EasyCVR安防视频监控平台不仅支持AI边缘计算智能硬件设备的接入,还能快速集成AI智能分析平台,接收来自智能分析平台或设备的AI告警信息,如烟火检测、周界入侵检测、危险区域闯入检测、安全帽/反光衣佩戴检测等。 本文将详细介绍如何在EasyCVR…

以1.7K深圳小区房价为例,浙大GIS实验室使用注意力机制挖掘地理情景特征,提升空间非平稳回归精度

地理加权回归 (Geographically Weighted Regression, GWR) 是一种广泛应用于地理空间分析的统计方法,用于捕捉地理现象的空间非平稳性(即空间异质性)。传统 GWR 通过为每个观测点分配权重来反映其对回归参数的影响,这些权重通常基…

【JavaEE】线程安全

【JavaEE】线程安全 一、引出线程安全二、引发线程安全的原因三、解决线程安全问题3.1 synchronized关键字(解决修改操作不是原子的)3.1.1 synchronized的特性3.1.1 synchronized的使用事例 3.2 volatile 关键字(解决内存可见性) …

智慧农业中光谱相机对土壤成分的无损检测应用‌

可浏览之前发布的一篇文章:光谱相机在农业中的具体应用案例 一、土壤成分定量分析 ‌养分检测‌ 光谱相机通过捕捉土壤反射的特定波长光线,可精准检测氮、磷、钾等主要养分含量,以及有机质和水分比例。例如,不同养分对近红外波段…

实现浏览器交互Ai Web Ui-本地化部署的deepseek + Ollama + Page Assist

一、deepseek本地化部署 上篇写了deepseek本地化部署的小白教程。 deepseek 本地化部署(小白也可部署) 但有个问题,Ollama只能在命令行进行交互,体验相当差。 二、Page Assist安装 本篇给大家介绍个好用的chrome浏览器AI Web …

使用Maven搭建Spring Boot框架

文章目录 前言1.环境准备2.创建SpringBoot项目3.配置Maven3.1 pom.xml文件3.2 添加其他依赖 4. 编写代码4.1 启动类4.2 控制器4.3 配置文件 5.运行项目6.打包与部署6.1 打包6.2 运行JAR文件 7.总结 前言 Spring Boot 是一个用于快速构建 Spring 应用程序的框架,它简…

易语言模拟真人鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…

10.【线性代数】—— 四个基本子空间

十、 四个基本子空间 1. 列空间 C ( A ) C(A) C(A) in R m R^m Rm2. 零空间 N ( A ) N(A) N(A) in R n R^n Rn3. 行空间 C ( A T ) C(A^T) C(AT) in R n R^n Rn4. 左零空间 N ( A T ) N(A^T) N(AT) in R m R^m Rm综述5. 新的向量空间 讨论矩阵 A m ∗ n A_{m*n} Am∗n​…

使用通义万相Wan2.1进行视频生成

使用通义万相Wan2.1进行视频生成 源代码准备运行环境准备创建Python虚拟环境并激活安装依赖包 模型下载生成视频官网的视频生成例子简单描述场景视频生成示例详细描述场景视频生成示例 最近通义万相开源了其视频生成模型。模型有两个版本,一个是1.3B的,一…

P8651 [蓝桥杯 2017 省 B] 日期问题--注意日期问题中2月的天数 / if是否应该连用

P8651 [P8651 [蓝桥杯 2017 省 B] 日期问题--注意日期问题中2月的天数 / if是否应该连用 题目 分析代码 题目 分析 代码中巧妙的用到3重循环,完美的解决了输出的顺序问题【题目要求从小到大】 需要注意的是2月的值,在不同的年份中应该更新2月的值 还有…

smolagents学习笔记系列(番外二)Agent+Ollama分析本地图像与文件

这篇文章是在 smolagents 官方教程结束后的番外篇二,实现了如何使用 smolagents 库 Ollama 调用本地模型对图像与文件进行分析。 【注意】:这篇文章需要你在本地部署Ollama的视觉语言模型,如果你的架构方案是纯线上模式,则可以跳…

Java 入门 (超级详细)

一、什么是Java Java是一种高级编程语言,由Sun Microsystems公司于1995年推出。Java具有跨平台性、面向对象、健壮性、安全性、可移植性等特点,被广泛应用于企业级应用开发、移动应用开发、大数据处理、云计算等领域。Java程序可以在不同的操作系统上运…