当前位置: 首页 > 知识库问答 >
问题:

new/malloc在内存充足但碎片化的环境中是否会导致内存洗牌?

谢涵煦
2023-03-14

这只是出于好奇。

[xx------]
[xx--xxx-]

如果是这样,那么扩展到一个极端的情况,如果您的内存以某种方式结束了超级碎片(例如,每隔一个字节都被分配为ala

我想站台不重要?

很抱歉提出了一个扩展的问题,但这也会发生在其他语言中吗,比如Java/C#?

共有1个答案

羊舌胡非
2023-03-14

没错,内存可能会变得如此零碎,以至于不再可能进行分配。一个好的分配器会在可能的情况下合并释放的块,以限制碎片。

NET managed framework通过间接分配内存块(即通过指向块指针的指针)来解决此问题。这样,块可以移动到内存碎片整理,而不需要改变指针的指针。(框架会注意避免并发问题,因为.NET有一个异步运行的垃圾收集器。)

 类似资料:
  • 主要内容:分配内存空间,回收算法,总结前边介绍的有关动态内存管理的方法,无论是边界标识法还是伙伴系统,但是以将空闲的存储空间链接成一个 链表,即可利用空间表,对存储空间进行分配和回收。 本节介绍另外一种动态内存管理的方法,使用这种方式在整个内存管理过程中,不管哪个时间段,所有未被占用的空间都是地址连续的存储区。 这些地址连续的未被占用的存储区在编译程序中称为堆。 图 1 存储区状态 假设存储区的初始状态如图 1 所示,若采用本节介绍的

  • 问题内容: 我一直在阅读有关Linux内存不足的情况,手册页中的以下段落让我开始思考: 默认情况下,Linux遵循乐观的内存分配策略。这意味着当malloc()返回非NULL时,不能保证内存确实可用。这是一个非常糟糕的错误。万一发现系统内存不足,一个臭名昭著的OOM杀手将杀死一个或多个进程。[…] 考虑到操作员的new实现最终会在某个时刻调用malloc,是否可以保证new实际上会在Linux上抛

  • 即使在相当小的数据集上,我也会遇到堆空间错误。我可以确定我没有耗尽系统内存。例如,考虑一个包含大约20M行和9列的数据集,它占用了磁盘上的1GB。我正在一个具有30gb内存的Google Compute节点上玩它。 假设我在一个名为df的数据框中有这些数据。以下操作很好,但速度有点慢: 下面抛出java。lang.OutOfMemoryError:Java堆空间。 我尝试了这个建议,以增加要激发的

  • 问题内容: 我正在编写一个测试程序,如下所示: 当用户单击按钮A时,它将打开50个JFrame。 当用户单击按钮B时,它将放置所有通过单击按钮A显示的JFrame。 我发现单击按钮B后内存不会减少。我使用任务管理器(在Windows中为+ + ,并检查“ java”的内存使用情况)确定了这一点。 问题答案: 是的,没有办法,无法解决(不仅在Java PL中), 1)实际上,不要在运行时/运行时创建

  • 我正在研究一种需要对大矩阵进行数学运算的算法。基本上,该算法包括以下步骤: 输入:大小为n的两个向量u和v > 对于两个矩阵中的每个条目,应用一个函数f。返回两个矩阵M_u,M_v 求M_的本征值和本征向量。对于i=0,返回e_i,ev_i,。。。,n-1 计算每个特征向量的外积。返回一个矩阵O_i=e_i*转置(e_i),i=0,。。。,n-1 用e_i=e_i delta_i调整每个特征值,其

  • 问题内容: 使用该标志提供一个1 GB的堆,以下功能可以正常工作: 该阵列应代表约600 MB。 但是,以下引发OutOfMemoryError: 尽管该阵列应代表约800 MB,因此很容易装入内存。 丢失的记忆在哪里消失了? 问题答案: 在Java中,堆中通常有多个区域(和子区域)。您拥有一个年轻且历久弥新的地区,拥有最多的收藏家。大阵列会立即添加到租用区域,但是根据您的最大内存大小,将为年轻空