问题标签 [memory-fragmentation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
566 浏览

memory - 是什么导致内存碎片率极低?

我们的 Redis 4.0.2 实例出现了一些奇怪的内存问题。主实例的比率为 0.12,而从属实例的比率合理,略高于 1。当我们重新启动主实例时,内存碎片率回到 1,直到我们达到峰值负载时间,然后比率又回落到小于 0.2。操作系统(Ubuntu)告诉我们 redis 实例正在使用 13GB 的虚拟内存和 1.6GB 的 RAM。一旦发生这种情况,大部分数据都会被交换到磁盘上,性能几乎会停止。

我们的密钥在被清除之前往往会持续一两天。大多数值是散列和 zset,大约有 100 个条目,每个条目小于 1kb 左右。

我们不确定是什么原因造成的。我们已经尝试调整操作系统overcommit_memory。我们也尝试了新MEMORY PURGE命令,但似乎都没有帮助。我们正在寻找其他可以探索的东西和尝试的建议。任何意见,将不胜感激。

造成这种情况的可能原因是什么?我们如何才能使该比率更接近 1?

这是我们的内存信息的转储:

还有我们的记忆统计:

0 投票
1 回答
1829 浏览

c# - 如何解决 Gen2 堆碎片

我正在运行一个为 HTTP 请求提供服务的 C# 应用程序。我最近注意到它占用的内存比我预期的要多。我抓了一些转储,在 Windbg 中弹出,发现大部分内存都标记为 Free:

因此转储约为 3GB,因此其中大约一半是可用内存。看着堆,我看到了这个:

所以我的小对象堆非常分散,特别是 Gen2。在服务器上,我可以看到正在发生 gen2 集合(使用性能计数器),但即使它们是,看起来 gen2 堆也没有被压缩。即使服务器上只有 1-2% 的 RAM 可用,gen2 堆也不会被压缩。

对我来说,看起来我正在承受这种内存压力,因为堆是碎片化的。但是我无法弄清楚为什么会发生碎片或为什么 gen2 无法被压缩。一些可用空间的大小为 6MB,所以我认为它肯定会压缩这些空间。

谁能给我一些关于如何弄清楚为什么我的堆如此分散的想法?我什至在这里吠叫正确的树吗?

任何帮助将不胜感激,谢谢!

编辑1:

细分!gchandles为:

0 投票
1 回答
720 浏览

opengl - OpenGL 会处理 GPU 内存碎片吗?

所以基本上每当我创建缓冲区对象时,Opengl 都会在 GPU 上分配一些内存。

考虑场景 1,我为 2 个统一变量生成 2 个统一缓冲区。

现在考虑场景 2,其中我创建了一个缓冲区并将 2 个统一变量包含在一个接口块中。

我的理解是,对于场景 1,分配了两个单独的内存区域,而对于场景 2,分配了一大块连续的内存。如果是这样,那么场景 1 可能容易受到内存碎片的影响,如果发生这种情况,它是由 OpenGL 还是由其他东西管理的,或者我们是否应该在编写性能关键代码之前记住这一点?

0 投票
0 回答
502 浏览

python - Base64 转换中的内存使用情况?

我在 python 中使用 base64.b64encode 库将我的图像转换为他们的 b64 版本。我注意到虽然 b64 规范说它需要 1.3 倍于原始数据的内存。我观察到它几乎是原始尺寸的两倍。

谁能解释这种行为?进行 base 64 编码时是否存在内存碎片?

0 投票
0 回答
39 浏览

.net - CLR 在抛出 OutOfMemoryException 之前做了什么?

我想确切地知道CLR在抛出OutOfMemoryException(OOME)之前做了什么。我知道可能的原因是没有连续的可用内存块,但是CLR 在做出此决定之前是否主动做任何事情?(例如收集、紧凑堆等)

这个答案这个答案表明 GC 在抛出 OOME 之前确实做了一些事情,并且之后做一些事情可以缓解 OOME。也就是说,这个回应似乎与后一个答案相矛盾。

这个问题的原因是在重负载下,我们已经看到了OOME,并希望减轻导致这种情况的条件。我们尝试过的策略之一是在捕获 OOME 时运行此代码:

如果 CLR 在选择抛出异常之前已经做了类似的事情,这将是多余的。

0 投票
2 回答
143 浏览

c - 什么算法适用于小内存块的连续重新分配?

在 C 程序中,我面临需要大量内存块的事务,我需要知道是否有用于处理所有这些 malloc/free 的算法或最佳实践 teqnique,我使用数组来存储这些内存块,但在某些情况下点数组本身已满,重新分配数组只是更浪费,处理这个问题的优雅方法是什么?

0 投票
2 回答
7578 浏览

c++ - “内存碎片”还是个问题吗?

我有点困惑。在操作系统课程中,我们被告知所有操作系统都通过分页或分段来处理内存碎片,并且根本没有连续的物理内存分配。操作系统使用不同级别的寻址(逻辑/物理)来避免连续的内存分配。现在这里有很多关于它的讨论。我的问题是:这个问题在支持逻辑寻址的操作系统的 C++ 编程中是否真实存在(是否有任何进程因为内存碎片而崩溃)?如果是,为什么首先每个操作系统都试图避免连续寻址?

0 投票
1 回答
259 浏览

opengl - 如何避免显存碎片?

我意识到没有办法避免它,因为OpenGL 没有提到 VRAM 碎片。

但无论如何,我的应用程序中存在碎片,我想尝试在常见平台上减少它。

我在该主题上发现的唯一内容是:

防止大量内存碎片的最佳方法是尝试并限制项目中不同分辨率的数量。当资产被换成​​具有相同分辨率的资产时,通常它可以将其放在内存中。

这很有意义。

这真的是个好主意吗?还有其他要记住的事情吗?

请注意,在我的用例中,我几乎所有的 VRAM 使用都由纹理(以及后/前/深度缓冲区)组成。几乎没有缓冲对象等。

0 投票
0 回答
344 浏览

c# - C#,字节数组,避免内存碎片

我正在编写一个数据结构,其主要目的是包含以这种方式组织的二进制数据(字节数组),用户可以在中间插入数据而不会造成性能损失(移动大块内存)。

为此,我需要创建许多较小的字节数组,它们将用作较大结构部分的缓冲区。问题是我可能需要经常处理这些小数组,而且我担心可能出现内存碎片。

我避免它的想法是确保我在此结构中使用的所有数组都具有两种大小之一,例如 1024 或 2048 字节(或类似,通常为 n 和 2*n)。我希望简化内存管理器的工作,它能够在处理完数组后重用内存。

它会那样工作吗?还是我应该设计某种数组池并自己实现数组重用机制?

0 投票
0 回答
111 浏览

android - 如何避免 32 位 Linux 内核的虚拟碎片问题?

每个人都知道系统中的虚拟内存碎片问题。我们如何从内核驱动的角度改善 32 位内核中的碎片问题?

由于我们无法控制应用程序的行为。存在 600 MB 可用虚拟内存但仍会出现内存不足的问题。

任何建议高度赞赏。