什么是内存碎片?

2023-12-23

我听说过在 C++ 动态内存分配上下文中多次使用过“内存碎片”这个术语。我发现了一些关于如何处理内存碎片的问题,但找不到处理它本身的直接问题。所以:

  • 什么是内存碎片?
  • 如何判断内存碎片是否是我的应用程序的问题?什么样的程序最有可能受到影响?
  • 处理内存碎片的常用方法有哪些?

Also:

  • 我听说大量使用动态分配会增加内存碎片。这是真的?在 C++ 上下文中,我了解所有标准容器(std::string、std::vector 等)都使用动态内存分配。如果在整个程序中使用这些(尤其是 std::string),内存碎片是否更有可能成为问题?
  • 如何在 STL 密集型应用程序中处理内存碎片?

想象一下,您有一个“大”(32 字节)的可用内存:

----------------------------------
|                                |
----------------------------------

现在,分配其中的一些(5 次分配):

----------------------------------
|aaaabbccccccddeeee              |
----------------------------------

现在,释放前四个分配,但不释放第五个:

----------------------------------
|              eeee              |
----------------------------------

现在,尝试分配 16 个字节。哎呀,我不能,尽管有几乎两倍的免费空间。

在具有虚拟内存的系统上,碎片问题比您想象的要小,因为大型分配只需要在内存中连续即可。virtual地址空间,不在physical地址空间。因此,在我的示例中,如果我的虚拟内存页面大小为 2 字节,那么我可以毫无问题地分配 16 字节。物理内存看起来像这样:

----------------------------------
|ffffffffffffffeeeeff            |
----------------------------------

而虚拟内存(更大)可能如下所示:

------------------------------------------------------...
|              eeeeffffffffffffffff                   
------------------------------------------------------...

内存碎片的典型症状是,您尝试分配一个大块,但无法分配,即使您似乎有足够的可用内存。另一个可能的结果是进程无法将内存释放回操作系统(因为它从操作系统分配的每个大块,对于malloc等等来细分,其中还剩下一些东西,即使每个块的大部分现在都未使用)。

C++ 中防止内存碎片的策略是根据对象的大小和/或预期寿命从不同区域分配对象。因此,如果您要创建大量对象并稍后将它们全部销毁,请从内存池中分配它们。您在它们之间进行的任何其他分配都不会来自池,因此不会位于内存中的它们之间,因此内存不会因此而产生碎片。或者,如果您要分配大量相同大小的对象,则从同一个池中分配它们。那么池中的一段可用空间永远不会小于您尝试从该池分配的大小。

一般来说,您不需要太担心,除非您的程序长时间运行并且进行大量分配和释放。当你同时拥有短寿命和长寿命的对象时,你面临的风险最大,但即便如此malloc将尽力提供帮助。基本上,忽略它,直到您的程序分配失败或意外导致系统内存不足(在测试中捕获此问题,以供优先选择!)。

标准库并不比任何分配内存的东西差,标准容器都有一个Alloc如果绝对必要,您可以使用模板参数来微调其分配策略。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是内存碎片? 的相关文章

  • 为什么 MetaSpace 大小是已用 MetaSpace 的两倍?

    我写了一个程序来模拟MetaSpace OOM 但我发现MetaSpace Size几乎总是两倍大Used MetaSpace Why 我用标志运行我的程序 XX MaxMetaspaceSize 50m 程序抛出OOM时Used Meta
  • 如何将包含 5000 条记录的 Excel 文件插入到 documentDB 中?

    我有一个 Excel 文件 最初约有 200 行 我能够将 Excel 文件转换为数据表 并且所有内容都正确插入到 documentdb 中 Excel 文件现在有 5000 行 在插入 30 40 条记录后不会插入 其余所有行不会插入到
  • 起订量要求?违背了目的?

    是否需要虚拟化您想要模拟的所有属性访问器就违背了模拟的目的 我的意思是 如果我必须修改我的对象并虚拟化我想要模拟的每个访问器 我难道不能继承我的类并自己模拟它吗 你的问题非常有效 但如果你仔细想想 没有其他方法可以模拟课程 如果你采用一个接
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 方法“xxx”不能是事件的方法,因为该类派生的类已经定义了该方法

    我有一个代码 public class Layout UserControl protected void DisplayX DisplayClicked object sender DisplayEventArgs e CurrentDi
  • 存储过程上的 OdbcCommand - 输出参数上出现“未提供参数”错误

    我正在尝试执行存储过程 通过 ODBC 驱动程序针对 SQL Server 2005 但收到以下错误 过程或函数 GetNodeID 需要参数 ID 但未提供该参数 ID 是我的过程的 OUTPUT 参数 在存储过程中指定了一个输入 mac
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • 编译器错误“错误:在文件范围内可变地修改了‘字符串’”

    考虑 include
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 特征密集稀疏矩阵乘积是线程化的吗?

    我知道稀疏密集产品是根据文档进行线程化的 https eigen tuxfamily org dox TopicMultiThreading html https eigen tuxfamily org dox TopicMultiThre
  • dropdownlist DataTextField 由属性组成?

    有没有一种方法可以通过 C 使 asp net 中的下拉列表的 datatextfield 属性由对象的多个属性组成 public class MyObject public int Id get set public string Nam
  • 错误左值需要作为赋值C++的左操作数

    整个程序基本上只允许用户移动光标 如果用户位于给定的坐标范围 2 2 内 则允许用户键入输入 我刚刚提供了一些我认为足以解决问题的代码 我不知道是什么导致了这个问题 你能解释一下为什么会发生吗 void goToXY int int 创建一
  • .NET JIT 编译的代码缓存在哪里?

    NET 程序首先被编译为 MSIL 代码 当它被执行时 JIT编译器会将其编译为本机机器代码 我想知道 这些JIT编译的机器代码存储在哪里 它只存储在进程的地址空间中吗 但由于程序的第二次启动比第一次快得多 我认为即使在执行完成后 该本机代
  • 使用(linq to sql)更新错误

    我有两个表 通过外键 CarrierID 绑定 Carrier CarrierID CarrierName CarrierID 1 CarrierName DHL CarrierID 2 CarrierName Fedex Vendor V
  • 相当于 C# 中 Java 的“ByteBuffer.putType()”

    我正在尝试通过从 Java 移植代码来格式化 C 中的字节数组 在 Java 中 使用方法 buf putInt value buf putShort buf putDouble 等等 但我不知道如何将其移植到 C 我尝试过 MemoryS
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • “int i=1,2,3”和“int i=(1,2,3)”之间的区别 - 使用逗号运算符的变量声明[重复]

    这个问题在这里已经有答案了 int i 1 2 3 int i 1 2 3 int i i 1 2 3 这些说法有什么区别 我无法找出任何具体原因 Statement 1 Result Compile error 运算符的优先级高于 运算符
  • C++ [Windows] 可执行文件所在文件夹的路径[重复]

    这个问题在这里已经有答案了 我需要访问一些文件fstream在我的 Windows 上的 C 应用程序中 这些文件都位于我的exe文件所在文件夹的子文件夹中 获取当前可执行文件的文件夹路径的最简单且更重要的 最安全的方法是什么 Use 获取
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • 启动画面后主窗口出现在其他窗口后面

    我有一个带有启动屏幕的 Windows 窗体应用程序 当我运行该应用程序时 启动屏幕显示正常 消失并加载应用程序的主窗体 但是 当我加载主窗体时 它出现在包含该应用程序的 Windows 资源管理器目录下 这是运行启动画面然后运行主窗体的代

随机推荐

  • 查找两个字符串之间的最短匹配

    我有一个很大的日志文件 我想提取两个字符串之间的多行字符串 start and end 以下是来自的示例inputfile start spam start rubbish start wait for it profit here end
  • Firebase 和后台运行时的预定通知

    我希望我的 Firebase 向我的应用程序的所有用户发送计划的推送通知 如果该应用程序位于后台 运行一些代码并向服务器发送一些内容 我有点迷失 因为使用 Firebase 的通知控制台无法做到这一点 然后 我对 Firebase Clou
  • Java:如何从任何 JComponent 中删除默认的 KeyStrokes?

    我想控制哪个击键属于哪个Jcomponent 我什至想了解如何删除与Jcomponent并用其他最喜欢的击键替换它们 我遵循了这个神谕tutorial http docs oracle com javase tutorial uiswing
  • SQL Server:是否可以在不设置链接服务器的情况下从另一个SQL服务器获取数据?

    我需要执行以下查询 例如 SELECT c1 CustomerName FROM Customer as c1 INNER JOIN ExternalServer Database dbo Customer as c2 ON c2 RefI
  • 在同一 git 目录结构中管理代码和文档

    我将一个项目从 Google Code 转移到了 Github 该项目在一个目录结构中包含代码和文档 我想使用Github的 Pages 功能来托管html文档 理想情况下 我想做 1push提交对代码和文档的更改 我怎样才能实现这个目标
  • 我可以为数据库实例使用多个 C3P0 数据源吗?

    我想知道是否可以为一个数据库运行多个 c3p0 数据源 例如
  • 调整 rmarkdown 中的弹性位置

    我正在使用 Flextable 在 rmarkdown 中创建的 Word 文档中制作漂亮的表格 这些表格都在文档的中心对齐 我希望它们在左侧对齐 我知道 body add flextable 有一个对齐参数 但该函数似乎用于将弹性表插入现
  • Pandas:当列相等时获取不同行的平均值

    我试图找到不同行中值的平均值 并按其他列中的相似性进行分组 例子 In 14 pd DataFrame col1 1 2 1 2 col2 A C A B col3 1 5 6 9 Out 14 col1 col2 col3 0 1 A 1
  • 当方法为 TaskCompletionSource 变量返回 .Task 时,这意味着什么?

    特别适用于 return tcsInitialize Task 在这堂课上 internal class TextToSpeechImplementation AndroidTextToSpeech tts TaskCompletionSo
  • 跨多个项目/微服务的 Django 模型。如何?

    我想知道如何解决多个 独立的 django 项目 微服务之间的模型结构共享 例如 项目 API 项目 用户仪表板 项目 管理仪表板 项目 统计 每个项目都使用相同的 django 模型 有没有一种正确的方法来解决这个问题 Django 的基
  • 我们可以将“phonegap api”应用程序与纯本机应用程序(obj-C)代码连接起来吗

    我正在做一个项目 第一页应该是 phonegap api html 页面 当点击特定的链接 r 按钮时 它应该被带到本机应用程序 纯 objC 纯本机应用程序 带有视图控制器 表视图等 我们可以将html页面与纯原生代码连接起来吗 如果是
  • 当一段时间过去或浏览器关闭时,cookie 会过期吗?

    我知道我可以设置 cookie 的过期日期 但是我可以让 cookie 在一段时间后或浏览器关闭时过期吗 如果您设置到期日期 则无论浏览器打开还是关闭 它们都会在该日期到期 一旦浏览器关闭 只有非持久性 cookie 才会过期 See co
  • 使用序数值时 php strtotime 函数出现问题

    在 strtotime 中使用序数值时 有时会得到意想不到的结果 例如 为什么 date M j strtotime second Tuesday February 2011 结果是 Feb 15 实际上是third2011 年的星期二 你
  • 如何根据 TCL 数组的键值对其进行排序?

    The INITIAL ARRAY is Key gt Value B 8 C 10 A 5 E 3 D 1 为了获得基于键的排序数组 我使用 set sorted keys array lsort array names INITIAL
  • 如何迭代 C++ 类的变量成员

    我目前正在尝试对我正在读入的一些数据的一堆变量 基于不同相空间中的标准化 进行复杂的变量校正 由于每次校正都遵循相同的过程 我想知道是否会有无论如何 要迭代地执行此操作 而不是单独处理每个变量 因为我需要对大约 18 20 个变量执行此操作
  • 调用函数的宏

    我需要一个宏 或一个函数 但最好是一个宏 它接受函数名称和无限数量的参数 然后将参数传递给函数 假设这个宏是MACROFOO define MACROFOO function what do I put here int foo bar i
  • 剥离列或行以形成一维数组

    我想从 2D 数组创建 1D 数组 而无需仅使用 1 行代码进行循环 例如 newvec oldvec 3 在 MATLAB 中 它将从 oldvec 的第三列创建一个一维数组 newvec 我的搜索告诉我 在 VBA 中执行此操作的唯一方
  • dbo.aspnet_Users 和 dbo.aspnetUsers 之间有什么区别?

    VS 2013 框架 4 5 1 我运行 Aspnet regsql exe 来创建架构 它创建的表中带有下划线 例如 aspnet Users 它还创建了关联的存储过程 这些存储过程确实有效 并且它们将记录添加到表中 例如 将用户添加到
  • RavenDb:更新非规范化参考属性值

    我已经实现了RavenDB非规范化参考 http ravendb net docs faq denormalized updates图案 我正在努力将静态索引和补丁更新请求连接在一起 以确保在引用的实例值更改时更新我的 非规范化引用属性值
  • 什么是内存碎片?

    我听说过在 C 动态内存分配上下文中多次使用过 内存碎片 这个术语 我发现了一些关于如何处理内存碎片的问题 但找不到处理它本身的直接问题 所以 什么是内存碎片 如何判断内存碎片是否是我的应用程序的问题 什么样的程序最有可能受到影响 处理内存