问题标签 [heap-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 投票
1 回答
3061 浏览

c - 64 位平台上 GCC 中的基本堆使用统计信息

我需要从 GCC 为 Linux 编译的 C 程序中回答一个基本问题:当前使用了多少进程堆(由 分配malloc)以及如果空闲堆阻塞,还有多少驻留。标准库的 GNU 实现具有mallinfo准确报告我需要的功能,但它只能用于 32 位配置,而且,AFAIK,没有 64 位等效功能(顺便说一句,有人知道为什么吗?)。

我在 Linux 上使用 GCC,所以我在 Linux 上需要它。但是我假设堆对系统是不透明的,所以回答这个问题的唯一方法是使用标准库实现提供的手段。

在 Windows 平台上的 MSVC 实现中,没有等效的mallinfo功能,但有所谓的heap-walk功能,它允许通过遍历堆中的所有块来计算必要的信息。AFAIK,GNU C 库中没有堆遍历接口。(在那儿?)。

那么,再次,我在 GCC 中做什么?它不一定要高效,这意味着前面提到的基于堆遍历的方法对我来说非常好。如何找出 GCC 中有多少堆正在使用以及有多少可用?我可能可以尝试安装 malloc-hooks 并“手动”跟踪大小,尽管我不确定如何在mallinfo.arena不使用mallinfo.

0 投票
6 回答
258 浏览

c - 内存和指针

我需要一些帮助来思考一项任务。

我的任务是创建一个内存区域

然后使用指针将文本存储到这个存储位置: 我们要把这个区域划分为 32 字节的数据块,所以我们可以存储: 320/32 = 10 个数据块一个 32 字节。在一个数据块中,我可以存储(1 个 ASCSII 字符 = 1 个字节)32 个字符。

我有一个 10 长的位图,其中每个位都指示是否使用数据块(1)或不使用(0)。

但是,如果我想存储 60 个字符长的文本怎么办?然后我需要 2 个数据块(2 x 32 字节)。位图显示数据块 2 和 6 是空闲的,1 和 6 不是并排的。我怎样才能做到这一点?

0 投票
6 回答
38720 浏览

c - 什么是连续内存块?

就像标题一样,什么是连续内存块?

0 投票
1 回答
96 浏览

garbage-collection - 针对特定情况的垃圾收集

我正在研究垃圾收集的基础知识和每种算法的不同算法(加上专业人士的缺点等)。我正在尝试确定用于不同场景的最佳垃圾收集算法。

例如:堆上的所有东西都大小相同,所有东西都小,寿命短,所有东西大,寿命更长。

- 如果一切都是相同大小的堆碎片不是问题。我也不必担心压实。所以也许引用计数?

- 寿命短的小 obj?

- 具有更长寿命的大型 obj?(可能是世代相传的,因为寿命)

我在看:引用计数、标记和扫描、停止和复制以及分代

0 投票
1 回答
6088 浏览

ios - 我的 iPad 运行时内存在哪里?

我显然导致设备(iPad)内存不足,所以它正在抛弃我的应用程序。我试图了解发生了什么,因为 Instruments 告诉我我正在使用大约 80Mb,并且设备上没有运行其他应用程序。

我找到了这段代码片段来向 iOS 下的 Mach 系统询问内存统计信息:

当我使用这个函数来获取三个内存值时,我发现 mem_total 的值正在下降,即使 mem_used 的总值没有太大变化。这是两个连续的输出行:

一些代码执行....

所以我突然从 157MB 的可用内存增加到 10MB 的可用内存,但我的使用量只从 78MB 增加到 84MB。总内存从 236MB 减少到 94MB。

这对任何人都有意义吗?在此期间设备上没有运行其他应用程序,该设备应该基本上完全专用于我的应用程序。

在两次内存检查之间执行的所有代码都是本机 C++ 代码,与任何 Apple 框架完全没有交互。确实有很多很多调用内存系统来从 C++ 堆分配和释放对象,但正如所见,最终只分配了大约 4MB 的额外内存,其余的都被释放/删除。

可能是堆碎片正在消耗丢失的内存吗?即,堆是否只是如此碎片化,以至于块开销正在消耗所有额外的、未计入的内存?

有没有其他人看到过这种行为?

谢谢,

-埃里克

0 投票
2 回答
2282 浏览

debugging - 托管堆碎片

我试图了解堆碎片化的工作原理。以下输出告诉我什么?

这个堆是否过于碎片化?

我有 243010 个“免费对象”,总共 53304764 个字节。堆中那些曾经包含对象但现在被垃圾收集的“自由对象”空间是否存在?

如何强制碎片堆清理?

0 投票
2 回答
581 浏览

memory - 在内存中表示格式化文本的最佳方法?C++

我正在编写一个基本的文本编辑器,它实际上是一个编辑控制框,我想在其中为我的主程序编写代码、数值和表达式。

我目前正在这样做的方式是将字符串输入到编辑控件中。在编辑控件中,我有一个类可以将字符串分解为“字形”,如单词、数字、换行符、制表符、格式标记等。例如,字形包含一个表示文字的字符串和一个短整数,表示尾随空格的数量。字形还包含绘制文本和计算换行时所需的信息。

例如,文本行“My name is Karl”将等于一个字形链接列表,如下所示:NewLineGlyph → WordGlyph (“My”, 1 个空格) → WordGlyph (“name”, 1 个空格) → WordGlyph(“is”, 1空白)→ WordGlyph(“Karl”,0 个空白)→ NULL。

因此,不是将字符串作为连续的字符块(或 WCHAR)存储在内存中,而是存储在小块中,并可能有大量的小分配和释放。

我的问题是;这样做时我应该关心堆碎片吗?您对提高效率有什么建议吗?还是完全不同的方式?:)

PS。我在 Win7 上使用 C++ 工作。

0 投票
1 回答
1303 浏览

c - 故意浪费所有的主内存来学习碎片

在我的课堂上,我们有一项作业,其中一个问题是:

C 中的内存碎片:设计、实现和运行一个 C 程序,它执行以下操作:它为 3m 数组的序列分配内存,每个数组大小为 500000 个元素;然后它会释放所有偶数数组并分配一个由 m 个数组组成的序列,每个数组大小为 700000 个元素。测量程序分配第一个序列和第二个序列所需的时间量。选择 m 以耗尽程序可用的所有主内存。解释你的时间

我的实现如下:

我已经改变了几种不同的方式,但我看到的一致性是,当我最初为 3*m*500000 元素数组分配内存时,它会用完所有可用的主内存。但是当我告诉它释放它们时,内存不会释放回操作系统,所以当它分配 m*700000 元素数组时,它会在页面文件(交换内存)中执行它,因此它实际上不会显示内存碎片.

上面的代码运行了 1000 次并取平均值,这需要相当长的时间。第一个序列平均耗时 2.06913 秒,第二个序列耗时 0.67594 秒。对我来说,第二个序列应该需要更长的时间来展示碎片是如何工作的,但是由于使用了交换,这不会发生。有没有办法解决这个问题,还是我的假设错了?

我会在星期一向教授询问我有什么,但在此之前,任何帮助将不胜感激。

0 投票
1 回答
3733 浏览

ios - 如何避免 iOS 中的堆碎片

我们的应用程序在运行时会创建很多小对象。它主要归结为自动释放的 NSString 和 NSNumber 对象。由于该应用程序设计为在后台运行“24/7”,因此堆碎片成为一个大问题。

在没有完全重组程序的情况下,有哪些技术可以避免这种情况。

我在想: - 对象池会在最终发布后将对象返回到池中,但那时对象需要是可变的。(NSMuttableString 本身会导致堆碎片吗?)

其他人如何处理这个问题?

编辑:这就是我对内存碎片产生怀疑的方式。查看 rpages 和 [vm-pageshortage]

0 投票
1 回答
1721 浏览

c - Linux 堆碎片

上周有个问题一直困扰着我。

在 Windows 调试器中,有一个!heap -s命令可以输出虚拟内存的堆状态并使用以下公式计算外部碎片:

linux中是否有类似的方法,可以输出计算效果所需的那些统计数据?

现在长话短说:我有一个 C 应用程序,它使用 malloc 和 free 不断分配和释放不同大小的空间,每次分配都有不同的寿命。我使用的平台是 Lubuntu,所以ptmalloc2算法是默认的。

我知道这些分配是在虚拟用户空间堆中提供的(分配器使用的那些大于 128Kb 的分配mmap除外),并且在实际访问时映射到物理页面。大多数分配的大小小于 80 字节,因此它们由 FastBins 提供。

使用ValgrindandMassif我可以获得内部碎片,因为它报告了用于每个分配的额外字节。

但是,我主要关心的是如何找出外部碎片。我知道/proc/[pid]/smaps堆大小和pmap-d[pid] anon统计信息,但我发现很难根据外部碎片来解释它们。

我也知道了LD_PRELOAD,我可以动态连接的/lib/i386-linux-gnu/libmemusage.so。该库输出堆总数、峰值和请求分配大小的分布。

我知道__malloc__hook现在已弃用,我真的不想依赖于实现特定的统计数据,例如malloc_stats()mallinfo()。但是,如果您对使用这两个有任何建议,请告诉我。

我可以说外部碎片问题是当一个请求无法满足时,因为堆中没有连续的空间,但请求的总大小分散在该区域周围。

我还没有弄清楚,如何获得所需的统计数据,以便计算这种效果。例如,不同的公式说明我必须捕获live_memory或获取total_free_pages,或获取largest_free_block. 我怎样才能有一个函数来“遍历”堆并收集这些统计信息?

提前谢谢大家。