问题标签 [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 回答
12 浏览

memory - 堆内存如何不碎片化

因此,我尝试在 Java 中模拟内存管理,主要用于教育目的。这个程序应该包含一个 malloc(int capacity) 和一个 free(int address) 方法。但事实证明,在不完全分割内存或使用过多 CPU 指令的情况下这样做并不是那么容易。我之前的一项尝试包括为每个对象占用大约 20 个额外的字节,并且添加另一个需要循环遍历整个 ram。我找不到任何关于正确算法如何工作的解释。我唯一能发现的是,有一个指针指向最后一个内存段的结束位置,并且每个段的长度都存储在它之前。因此,它的视觉表示如下所示:

如果添加一个长度为 4 个字节的对象:

让我们添加另一个对象(大小 4):

但是如果我释放了第一个对象,它不会在下次我添加内容时替换数据,因为首先,它甚至不知道位置 0 和 1 是空闲的,因为它没有保存在任何地方,并且其次,即使它会保存它,我也可以添加一个 16 字节的对象,它不适合 8 字节的间隙。这将导致一种情况,其中大部分内存必须被占用,只是保存内存中的所有间隙及其大小。而且 CPU 必须不断地循环遍历整个 ram,才能找到一个足够大的间隙来容纳我想要添加的对象。最重要的是,如果它们彼此相邻,则必须合并间隙。即使所有这些都完成了,它甚至不能保证我 100% 没有内存碎片。

0 投票
0 回答
42 浏览

c - 如何在 OSX 和 WIN 中测量碎片

我们的客户在某些特定情况下会遇到OOM,我们无法确定任何内存泄漏,因此我们想了解这是否是内存碎片问题。

在 OSX 和 WIN 中都有很多不同的内存指标(驻留、脏、工作集、保留、提交等),我们无法确定可以使用哪些指标来衡量碎片。

vmmapOSX 中的命令提供了一个碎片列,它的测量方法似乎如下:

问题是我们如何检索DIRTY SIZEBYTES ALLOCATED

mstats给出了分配和使用的内存量,malloc但报告的值与我们在 vmmap 中看到的任何内容都不匹配。

WIN也是一个完全不同的故事。我们查看了以下值,但我们不知道它们是否可用于测量碎片:

我们还查看了GetProcessMemoryInfo和同样的故事,我们不知道PROCESS_MEMORY_COUNTERS_EX中的值是否以及如何用于测量碎片。

TLDR:我们如何测量 OSX 和 WIN 中的碎片?