内存泄漏

news/2025/9/22 0:50:52/文章来源:https://www.cnblogs.com/9609ssr/p/19104432

内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测。因为内存泄漏的产生原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏通常不会直接产生可观察的错误症状,而是逐渐积累,降低系统整体性能,极端的情况下可能使系统崩溃。

以产生的方式来分类,内存泄漏可以分为四类:
1.常发性内存泄漏:发生内存泄漏的代码会被多次执行到,每次被执行时都会导致一块内存泄漏。
2.偶发性内存泄漏:发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。
3.一次性内存泄漏:发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅有一块内存发生泄漏。
4.隐式内存泄漏:程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。
从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到。

内存泄漏的常见原因
1.显式分配,隐式释放:使用 malloc, calloc, new 等分配了内存,但缺少对应的 free 或 delete。
2.异常处理路径未释放内存:代码中抛出了异常,但在异常捕获处理块中忘记了释放之前申请的内存。
3.数据结构处理错误:例如,从链表或哈希表中移除了节点,但未释放节点占用的内存。
4.循环引用(主要在带有垃圾回收的语言中,如 Java, C#, Python, JS):
对象A持有对象B的引用,对象B也持有对象A的引用。
即使外部已经不再需要A和B,但由于它们互相引用,垃圾回收器(Garbage Collector, GC)会认为它们仍然是“存活”的,从而无法回收它们。
5.静态集合类滥用:使用静态的集合(如 static Map)缓存对象,但从未或者很少清理,导致对象无限增长。
6.监听器和回调未注销:注册了事件监听器或回调函数,但在对象销毁时未及时注销,导致监听器对象无法被回收。
7.资源未关闭:打开了文件、网络连接、数据库连接等,使用后未正确关闭。这些资源通常与内存相关联,也会导致间接的内存泄漏。

如何在测试中发现内存泄漏?
发现内存泄漏不能只靠功能测试,需要进行专门的非功能性测试。
1.手动测试与观察
a) 长时间运行测试:让系统持续运行一个典型业务流程或多个流程组合,模拟真实使用场景。
b) 监控系统资源:使用任务管理器、活动监视器(Mac)等操作系统工具,观察目标进程的内存使用量(如 RSS - 常驻内存集)是否随着时间的推移而持续稳定增长,而不是在一定范围内波动后趋于稳定。
2.使用专业工具进行检测(这是最主要的手段)
例如:Python:
tracemalloc:标准库模块,可以跟踪内存分配的位置。
objgraph:可以可视化对象引用关系,帮助发现循环引用。
memory_profiler:逐行分析内存使用情况。
JavaScript (Node.js):
Chrome DevTools:可以连接到Node.js进程进行内存分析和堆快照对比。
heapdump 模块:可以生成堆转储文件供分析。
Node.js Inspector:内置的调试和分析功能。
3.自动化测试集成

如何预防?
1.良好的编程习惯:遵循“谁分配,谁释放”的原则。
2.代码审查:重点关注资源分配和释放的代码、异常处理分支、静态集合的使用以及监听器的注册/注销。
3.静态代码分析工具:许多IDE和工具(如SonarQube, Coverity, PVS-Studio)可以静态地检测出一些常见的内存泄漏代码模式。
4.将内存测试纳入测试计划:尤其是对于核心和长期运行的服务,必须将内存泄漏测试作为发布标准之一。

内存泄漏是一个“慢性病”,其测试和定位是软件测试中难度较高但至关重要的一环。它要求测试人员不仅要有测试思维,还要具备一定的系统、编程和调试工具使用知识。结合监控、专业工具和自动化流程,可以有效地在软件发布前发现并解决内存泄漏问题,保障软件的长期稳定性和用户体验。

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

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

相关文章

Context Engineering

很多人容易小看“prompt engineering”,认为这样的工作只是“调用大模型”而已。事实上随着时代的发展,“调用大模型”完成任务已经悄然成为了软件工程的新范式。相比之下, 传统软件工程只能完成由人事先编写的精确…

ios在wifi模式下设置http代理

1.使用概述 此模式在使用wifi的情况下进行使用,不需要安装任何app 2.打开手机的wifi设置a.打开wifi b.打开当前wifi(点击i) 滑倒最下面,[配置代理],设置为手动,点击进去修改为手动然后设置服务器,端口,用户,密码等这五…

面试官问:请画出 MySQL 架构图!这种变态问题都能问的出来

面试官问:请画出 MySQL 架构图!这种变态问题都能问的出来MySQL架构详解:从面试题到核心组件解析 MySQL架构主要分为四层:1)连接层负责连接管理;2)服务层处理SQL解析优化;3)存储引擎层(InnoDB/MyISAM等)实现数据存…

基于协方差交叉(CI)的多传感器融合算法matlab仿真,对比单传感器和SCC融合

1.程序功能描述 基于协方差交叉(CI)的多传感器融合算法matlab仿真,对比单传感器和SCC融合。对比速度估计误差RMSE指标,位置估计误差RMSE指标,等概率密度椭圆。 2.测试软件版本以及运行结果展示MATLAB2022A版本运…

github/网盘/公众号信息收集

(1)github信息收集 基于域名,邮箱,公司名称,备案号,个人名称,电话号码,qq号码 去百度上搜索资产,获取网站,然后在gihub上进行搜索 xxx.edu passwd 或者使用工具 http://github.com/obheda12/GitDorker/tree/…

AtCoder Regular Contest 206 (Div. 2) 部分题解

A B C D 题解AtCoder Regular Contest 206 (Div. 2) 部分题解 A - Range Replace 我们发现,若 \(a_i=a_{i+1}\) 则将操作左端点放在 \(i\) 和 \(i+1\) 是等价的,为了不重复,我们强制所有操作左端点都要放在 \(i\) 使…

Grafana 和 Openssh 高危漏洞修复

本次漏洞扫描,扫描到的高危漏洞涉及Grafana和Openssh,其中Grafana发现漏洞有(CVE-2023-3128、CVE-2022-23498、CVE-2023-4822、CVE-2024-1442),Openssh的漏洞有(CVE-2023-38408、CVE-2020-15778、CVE-2020-12062…

学习日报(补发)

时间:600min 搏客量:1 内容: 一、今日核心工作 今日的主要工作是成功在 Hadoop 集群环境中启动 Hive Metastore 服务,为后续的数据仓库操作和 HiveServer2 连接提供元数据管理支持。 二、工作执行详情 在 node1 节…

Influxdb 得模糊查询总结

InfluxDB 模糊查询完整总结与示例(修正版) 📊 查询方式全面总结(InfluxQL) 1. 精确匹配(最佳性能) -- 单值精确匹配 WHERE routername = NJ-MAIPU-1-- 多值精确匹配(使用OR) WHERE routername = NJ-MAIPU-1 …

多表关系和多表查询

多表关系和多表查询 1.0 一对多 表与表之间也存在关系,有一对一,一对多,多对多三种,比如部门表中的一个部门,对应着员工表中的多个员工 ,这就是一对多的关系,我们将多的一方称作子表,比如上面的员工表,一的一…

【反比例函数】【做题笔记】【图形存在性】题目合集

【反比例函数】【做题笔记】【图形存在性】题目合集 1.(2023 秋盐城月考) 如图,点 \(A\) 在双曲线 \(y=\frac{k}{x} \ (k \neq 0)\) 的第一象限的图象上,\(AB\) 垂直于 \(y\) 轴于点 \(B\),点 \(C\) 在 \(x\) 轴的…

20250920 嘉定江桥---江苏吴江区太湖 往返160KM骑行小记

20250920 嘉定江桥<--->江苏吴江区太湖 往返160KM骑行小记历时14小时, 完成了这次160km的骑行, 解锁新地标太湖, 也创造了我的个人单次骑行距离的纪录.从嘉定江桥出发, 沿北青公路向西骑行26KM直到尽头, 就可以出…

工作队列(Work Queues)与消息确认(Ack)

本章目标理解工作队列(竞争消费者模式)的概念和适用场景。掌握消息确认(Acknowledgment)机制,实现可靠的消息处理。学习消息持久化(Durability),防止服务器重启导致消息丢失。使用公平分发(Fair Dispatch)来…

React18新增的hook useId

useId 首先要理解SSR时,服务端和客户端的水合 服务端会生成一个HTML模版,和JS一起发给客户端,然后客户端的JS来“水合”HTML中的内容,转为可交互的组件。而官方文档中所说的“客户端组件被激活处理后的顺序可能与服…

十年架构演进史:从臃肿war包到云原生,我们终于解放了!

十年架构演进史:从臃肿war包到云原生,我们终于解放了!单体到微服务架构服务演化过程大家好,欢迎来到程序视点!我是你们的老朋友.安戈! 前言 各位技术人,不知道你们是否和我一样,每次打开一个老项目的代码仓库,…

week1作业

在 Java 中,我本学期主要遵循的编码规范如下: 类名我采用大驼峰命名法,每个单词的首字母大写,例如StudentInfo 、UserService。 方法名我采用小驼峰命名法,首单词首字母小写,其余单词首字母大写,如getStudentNa…

6-5 汇聚层

本章主要介绍汇聚层相关原理和实现1.最大汇聚层和平均汇聚层 import torch from torch import nn from d2l import torch as d2ldef pool2d(X, pool_size, mode=max):p_h, p_w = pool_sizeY = torch.zeros((X.shape[0]…

从IpadOS 26 Beta版切换成IpadOS 26 正式版

设置 - 通用 - 软件更新 - Beta版更新点击上图中的Beta版更新,进入如下图所示菜单,选择关闭返回至软件更新页面,点击IpadOS 26进行安装

2025.9.21总结

今天继续梳理已学习过的知识和学习路线。 对于已有技术,web开发,安卓开发而言。光凭借这些技术对于找到一份工作而言还是比较困难的。 而大三暑假的时候最长差不多能放出去半年的时间,也就是需要在寒假把简历打磨好…

6-4 多输入多输出通道

本章主要介绍通道多输入和多输出1.多输入通道 import torch from d2l import torch as d2l def corr2d_multi_in(X, K):# 先遍历 X 和 K 的第0个维度(通道维度),再把他们加在一起# 把所有配对得到的互相关结果逐元素…