问题标签 [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.
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
.
c - 内存和指针
我需要一些帮助来思考一项任务。
我的任务是创建一个内存区域
然后使用指针将文本存储到这个存储位置: 我们要把这个区域划分为 32 字节的数据块,所以我们可以存储: 320/32 = 10 个数据块一个 32 字节。在一个数据块中,我可以存储(1 个 ASCSII 字符 = 1 个字节)32 个字符。
我有一个 10 长的位图,其中每个位都指示是否使用数据块(1)或不使用(0)。
但是,如果我想存储 60 个字符长的文本怎么办?然后我需要 2 个数据块(2 x 32 字节)。位图显示数据块 2 和 6 是空闲的,1 和 6 不是并排的。我怎样才能做到这一点?
c - 什么是连续内存块?
就像标题一样,什么是连续内存块?
garbage-collection - 针对特定情况的垃圾收集
我正在研究垃圾收集的基础知识和每种算法的不同算法(加上专业人士的缺点等)。我正在尝试确定用于不同场景的最佳垃圾收集算法。
例如:堆上的所有东西都大小相同,所有东西都小,寿命短,所有东西大,寿命更长。
- 如果一切都是相同大小的堆碎片不是问题。我也不必担心压实。所以也许引用计数?
- 寿命短的小 obj?
- 具有更长寿命的大型 obj?(可能是世代相传的,因为寿命)
我在看:引用计数、标记和扫描、停止和复制以及分代
ios - 我的 iPad 运行时内存在哪里?
我显然导致设备(iPad)内存不足,所以它正在抛弃我的应用程序。我试图了解发生了什么,因为 Instruments 告诉我我正在使用大约 80Mb,并且设备上没有运行其他应用程序。
我找到了这段代码片段来向 iOS 下的 Mach 系统询问内存统计信息:
当我使用这个函数来获取三个内存值时,我发现 mem_total 的值正在下降,即使 mem_used 的总值没有太大变化。这是两个连续的输出行:
一些代码执行....
所以我突然从 157MB 的可用内存增加到 10MB 的可用内存,但我的使用量只从 78MB 增加到 84MB。总内存从 236MB 减少到 94MB。
这对任何人都有意义吗?在此期间设备上没有运行其他应用程序,该设备应该基本上完全专用于我的应用程序。
在两次内存检查之间执行的所有代码都是本机 C++ 代码,与任何 Apple 框架完全没有交互。确实有很多很多调用内存系统来从 C++ 堆分配和释放对象,但正如所见,最终只分配了大约 4MB 的额外内存,其余的都被释放/删除。
可能是堆碎片正在消耗丢失的内存吗?即,堆是否只是如此碎片化,以至于块开销正在消耗所有额外的、未计入的内存?
有没有其他人看到过这种行为?
谢谢,
-埃里克
debugging - 托管堆碎片
我试图了解堆碎片化的工作原理。以下输出告诉我什么?
这个堆是否过于碎片化?
我有 243010 个“免费对象”,总共 53304764 个字节。堆中那些曾经包含对象但现在被垃圾收集的“自由对象”空间是否存在?
如何强制碎片堆清理?
memory - 在内存中表示格式化文本的最佳方法?C++
我正在编写一个基本的文本编辑器,它实际上是一个编辑控制框,我想在其中为我的主程序编写代码、数值和表达式。
我目前正在这样做的方式是将字符串输入到编辑控件中。在编辑控件中,我有一个类可以将字符串分解为“字形”,如单词、数字、换行符、制表符、格式标记等。例如,字形包含一个表示文字的字符串和一个短整数,表示尾随空格的数量。字形还包含绘制文本和计算换行时所需的信息。
例如,文本行“My name is Karl”将等于一个字形链接列表,如下所示:NewLineGlyph → WordGlyph (“My”, 1 个空格) → WordGlyph (“name”, 1 个空格) → WordGlyph(“is”, 1空白)→ WordGlyph(“Karl”,0 个空白)→ NULL。
因此,不是将字符串作为连续的字符块(或 WCHAR)存储在内存中,而是存储在小块中,并可能有大量的小分配和释放。
我的问题是;这样做时我应该关心堆碎片吗?您对提高效率有什么建议吗?还是完全不同的方式?:)
PS。我在 Win7 上使用 C++ 工作。
c - 故意浪费所有的主内存来学习碎片
在我的课堂上,我们有一项作业,其中一个问题是:
C 中的内存碎片:设计、实现和运行一个 C 程序,它执行以下操作:它为 3m 数组的序列分配内存,每个数组大小为 500000 个元素;然后它会释放所有偶数数组并分配一个由 m 个数组组成的序列,每个数组大小为 700000 个元素。测量程序分配第一个序列和第二个序列所需的时间量。选择 m 以耗尽程序可用的所有主内存。解释你的时间
我的实现如下:
我已经改变了几种不同的方式,但我看到的一致性是,当我最初为 3*m*500000 元素数组分配内存时,它会用完所有可用的主内存。但是当我告诉它释放它们时,内存不会释放回操作系统,所以当它分配 m*700000 元素数组时,它会在页面文件(交换内存)中执行它,因此它实际上不会显示内存碎片.
上面的代码运行了 1000 次并取平均值,这需要相当长的时间。第一个序列平均耗时 2.06913 秒,第二个序列耗时 0.67594 秒。对我来说,第二个序列应该需要更长的时间来展示碎片是如何工作的,但是由于使用了交换,这不会发生。有没有办法解决这个问题,还是我的假设错了?
我会在星期一向教授询问我有什么,但在此之前,任何帮助将不胜感激。
ios - 如何避免 iOS 中的堆碎片
我们的应用程序在运行时会创建很多小对象。它主要归结为自动释放的 NSString 和 NSNumber 对象。由于该应用程序设计为在后台运行“24/7”,因此堆碎片成为一个大问题。
在没有完全重组程序的情况下,有哪些技术可以避免这种情况。
我在想: - 对象池会在最终发布后将对象返回到池中,但那时对象需要是可变的。(NSMuttableString 本身会导致堆碎片吗?)
其他人如何处理这个问题?
编辑:这就是我对内存碎片产生怀疑的方式。查看 rpages 和 [vm-pageshortage]
c - Linux 堆碎片
上周有个问题一直困扰着我。
在 Windows 调试器中,有一个!heap -s
命令可以输出虚拟内存的堆状态并使用以下公式计算外部碎片:
linux中是否有类似的方法,可以输出计算效果所需的那些统计数据?
现在长话短说:我有一个 C 应用程序,它使用 malloc 和 free 不断分配和释放不同大小的空间,每次分配都有不同的寿命。我使用的平台是 Lubuntu,所以ptmalloc2
算法是默认的。
我知道这些分配是在虚拟用户空间堆中提供的(分配器使用的那些大于 128Kb 的分配mmap
除外),并且在实际访问时映射到物理页面。大多数分配的大小小于 80 字节,因此它们由 FastBins 提供。
使用Valgrind
andMassif
我可以获得内部碎片,因为它报告了用于每个分配的额外字节。
但是,我主要关心的是如何找出外部碎片。我知道/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
. 我怎样才能有一个函数来“遍历”堆并收集这些统计信息?
提前谢谢大家。