问题标签 [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 投票
3 回答
1599 浏览

c# - 如何解决stringBuilder碎片?

我在我的 StringBuilders 中得到了一个很好的 SystemOutOfMemory 异常。这不是由于缺少内存,因此我认为这是内存碎片。

我有大约 200 个 StringBuiler 对象。所有这些都被定期重用(使用 strBldr.clear())。这似乎导致我的系统将内存碎片化得很糟糕。我该如何解决这个问题?

谢谢 :)

编辑:

以下是一些数据:

输入和 stringBuilder 的最大记录大小:4 146 698。

平均重新启动 stringBuilders/秒:>120(可能 >>120)

输入@第一个错误的长度:16 972(字符串)

StringBuilder 长度@第一个错误:16

新的 stringBuilder 被创建的次数@第一个错误:~32500

总内存使用@第一个错误 637 448K

0 投票
1 回答
180 浏览

.net - .net 应用程序导致内存碎片

我知道 .NET 应用程序(不使用任何未管理的代码)可能导致内存碎片的唯一方法是大对象堆。有什么方法可以检测您的应用程序是否正在碎片化内存并避免它?

0 投票
2 回答
1812 浏览

c - 为什么内存碎片在 64 位机器上是个问题?

在 32 位机器中,每个进程获得 4GB 的虚拟空间。在这种情况下,人们可能会担心我们可能会因碎片化而面临麻烦。但是在 64 位机器的情况下,理论上我们有一个巨大的可寻址虚拟内存,那么为什么在 64 位机器中内存碎片仍然是一个问题(如果是的话)?

0 投票
1 回答
782 浏览

sharepoint - SharePoint 2007 32 位中的 OutOfMemory 和内存碎片

几个星期以来,我一直在努力解决我们的 SharePoint 2007(已发布的具有许多自定义的 Intranet)WFE(SP 2 和 Win 2003 32 位服务器)上的 OutOfMemory 问题。在收到崩溃的内存转储后,我发现我们有内存碎片问题。对于转储分析,我使用以下两个工具:DiagDebug 和带有 sos.dll 的 Windbg。

结果:96.74% 的可用内存碎片

DebugDiag(内存压力分析器)

DebugDiag(SharePoint 分析器)

所以现在我想了解导致内存碎片的原因。希望您能够帮助我。这些是我为获取正确信息所做的步骤。

带有 sos.dll 的 Windbg

!地址摘要

似乎总体上有足够的空闲内存(742928 KB),但最大的空闲块只有 24192 KB。再次:释放内存碎片!

!线程

!eeheap -gc

!dumpheap (heap1 提取)

  • 0a060038 000e1a98 16 免费
  • 0a060048 793042f4 4096
  • 0a061048 000e1a98 16 免费
  • 0a061058 793042f4 528
  • 0a061268 000e1a98 16 免费
  • 0a061278 793042f4 4096
  • 0a062278 000e1a98 16 免费
  • 0a062288 793042f4 5112
  • 0a063680 000e1a98 16 免费
  • 0a063690 793042f4 4096
  • 0a064690 000e1a98 16 免费
  • 0a0646a0 793042f4 4096
  • 0a0656a0 000e1a98 16 免费
  • 0a0656b0 793042f4 5112
  • 0a066aa8 000e1a98 16 免费
  • 0a066ab8 793042f4 4096
  • 0a067ab8 000e1a98 16 免费
  • 0a067ac8 793042f4 4096
  • 0a068ac8 000e1a98 16 免费
  • 0a068ad8 793042f4 4096
  • 0a069ad8 793042f4 528
  • 0a069ce8 000e1a98 16 免费
  • 0a069cf8 793042f4 528
  • 0a069f08 793042f4 528
  • 0a06a118 000e1a98 16 免费
  • 0a06a128 793042f4 528
  • 0a06a338 000e1a98 260096 免费
  • 0a0a9b38 793042f4 4096
  • 0a0aab38 000e1a98 16 免费
  • 0a0aab48 793042f4 5784
  • 0a0ac1e0 000e1a98 16 免费
  • 0a0ac1f0 793042f4 4096
  • 0a0ad1f0 000e1a98 16 免费
  • 0a0ad200 793042f4 528
  • 0a0ad410 000e1a98 16 免费
  • 0a0ad420 793042f4 4096
  • 0a0ae420 000e1a98 16 免费
  • 0a0ae430 793042f4 528
  • 0a0ae640 000e1a98 16 免费
  • 0a0ae650 793042f4 4096
  • 0a0af650 000e1a98 16 免费
  • 0a0af660 793042f4 528
  • 0a0af870 000e1a98 16 免费
  • 0a0af880 793042f4 528
  • 0a0afa90 000e1a98 131120 免费
  • 0a0cfac0 793042f4 528
  • 0a0cfcd0 000e1a98 16 免费
  • 0a0cfce0 793042f4 4096
  • 0a0d0ce0 000e1a98 16 免费
  • 0a0d0cf0 793042f4 528
  • 0a0d0f00 000e1a98 16 免费
  • 0a0d0f10 793042f4 528
  • 0a0d1120 000e1a98 16 免费
  • 0a0d1130 793042f4 528
  • 0a0d1340 000e1a98 16 免费
  • 0a0d1350 793042f4 4096
  • 0a0d2350 000e1a98 16 免费
  • 0a0d2360 793042f4 5784
  • 0a0d39f8 000e1a98 16 免费
  • 0a0d3a08 793042f4 4096
  • 0a0d4a08 000e1a98 348200 免费
  • 0a129a30 793042f4 528
  • 0a129c40 000e1a98 16 免费
  • 0a129c50 793042f4 528
  • 0a129e60 000e1a98 361224 免费
  • 0a182168 793042f4 528
  • 0a182378 000e1a98 16 免费
  • 0a182388 793042f4 7016
  • 0a183ef0 000e1a98 16 自由
  • 0a183f00 793042f4 7016
  • ...
  • 63859d80 14762 413336 System.Xml.XmlElement
  • 6385a090 12103 435708 System.Xml.XmlName
  • 79332b54 21020 504480 System.Collections.ArrayList
  • 6385798c 32932 658640 System.Xml.NameTable+Entry
  • 6385c76c 35215 704300 System.Xml.XmlAttribute
  • 79331754 505 706416 System.Char[]
  • 7932dd5c 12751 714056 System.Reflection.RuntimePropertyInfo
  • 6385a284 36665 733300 System.Xml.XmlText
  • 79332cc0 5530 791644 System.Int32[]
  • 7932fde0 22824 1278144 System.Reflection.RuntimeMethodInfo
  • 79333274 6758 1733808 System.Collections.Hashtable+bucket[]
  • 793042f4 54360 5051132 System.Object[]
  • 79333594 4772 29304312 System.Byte[]
  • 79330b24 225539 ​​33121896 System.String
  • 000e1a98 239 72089072 免费
  • 总计 711343 个对象
  • 大于 0.5 MB 的碎片块:
  • 地址大小后跟 4331b1d8 14.8MB 441e8270 System.Threading.Overlapped

我查看了“免费”段之间的一些地址,但不幸的是,我找不到任何有关导致问题的来源的信息。

!do 0a182388

!gcroot 0a182388

!gcroot 0a129a30 ... 扫描线程 64 OSTHread 6420

!gcroot 0a061278 ... DOMAIN(000DD1B8):HANDLE(Pinned):1fb13f0:Root:0a061278(System.Object[])

!gchandles

在 DebugDiag SharePoint 分析中,报告了一些未处理的 SPWeb 对象。所以试图在这里找到原因......报告:“未处理的 SPWeb 对象0x02701168引用了已处理或无效的 SPRequest 对象:0x0270137c

!do 0x02701168

!gcroot 0x02701168

MS 处置的检查器也没有发现任何问题。

所以现在我不知道如何进一步找到导致内存碎片的(自定义)组件。我希望有人能给我一些提示、工具建议或可能导致碎片的组件检查列表(防病毒、缓存等)。问题只存在于 prod 环境中,我们现在唯一要做的就是 iisreset - 有时一天 5 次......</p>

提前谢谢你和最好的问候,

安东

0 投票
3 回答
1663 浏览

linux - Linux:如何检查进程可用的最大连续地址范围

我想在命令行输入pid,取回没有被保留的最大的连续地址空间。有任何想法吗?

我们的 32 位应用程序在 64 位 RHEL 5.4 上运行,运行一段时间后(比如 24 小时)就报废了。那时它只使用了 2.5 GB 的内存,但我们得到了内存不足的错误。我们认为它无法映射大文件,因为应用程序的内存空间是碎片化的。我想去生产服务器测试这个理论。

0 投票
2 回答
373 浏览

c++ - C++ 中的内存碎片

我想使用 malloc()/new 为变量 m 分配 256KB 内存。然后,使用 m 来存储字符串和数字等数据。我的问题是如何将数据保存到 m 并检索它们。

例如,如何将 int 123456 存储在偏移量 0 到 3 中并读取到变量 x 中?或者将“David”字符串从偏移量 4 存储到 8(或 9 与 \0),然后将其检索到变量 s?

0 投票
6 回答
843 浏览

c++ - 编码时考虑内存碎片:是否过早优化?

我正在开发一个使用 C++ 编写的大型服务器应用程序。该服务器可能需要运行数月而不重新启动。碎片在这里已经是一个可疑的问题,因为我们的内存消耗会随着时间的推移而增加。到目前为止,测量一直是将私有字节与虚拟字节进行比较,并分析这两个数字的差异。

我对碎片化的一般方法是将其留给分析。我对一般性能和内存优化等其他事情有相同的思考方式。您必须通过分析和证明来支持更改。

在代码审查或讨论期间,我注意到很多,内存碎片是最先出现的事情之一。这几乎就像现在对它有巨大的恐惧,并且有一个提前“防止碎片化”的大举措。请求的代码更改似乎有利于减少或防止内存碎片问题。我倾向于立即不同意这些,因为它们对我来说似乎是过早的优化。我会牺牲代码的清洁度/可读性/可维护性/等等。为了满足这些变化。

例如,采用以下代码:

上面,字符串流在这里进行的分配数量是未定义的,它可能是 4 个分配,或者只是 1 个分配。所以我们不能仅基于此进行优化,但普遍的共识是要么使用固定缓冲区,要么以某种方式修改代码以可能使用更少的分配。我并没有真正看到 stringstream 在这里扩展自身是导致内存问题的巨大贡献者,但也许我错了。

对上述代码的一般改进建议如下:

还有一个巨大的推动力是尽可能使用堆而不是堆。

有没有可能以这种方式抢占内存碎片,或者这只是一种错误的安全感?

0 投票
1 回答
519 浏览

c++ - C++:这看起来像内存碎片吗?

概括:

我有一个应用程序消耗更多的内存(大约是预期数量的 250%),但我似乎找不到任何内存泄漏。调用相同的函数(执行大量分配)将不断增加内存使用量到某个点,然后它不会改变并停留在那里。

计划详情:

该应用程序使用四叉树数据结构来存储“点”。可以指定要存储在内存中的最大点数(缓存大小)。'Points' 存储在 'PointBuckets' (链接到四叉树的叶节点的点数组)中,如果达到四叉树中的最大总点数,则将其序列化并保存到临时文件中,以便在何时检索需要。这一切似乎都很好。

现在,当加载文件时,会创建一个新的四叉树,如果旧的四叉树存在则删除它,然后从文件中读取点并一一插入四叉树。在节点拆分等过程中创建和删除存储桶时,会发生大量内存分配。

症状:

如果我加载一个预期使用 300MB 内存的文件,我会得到预期的内存消耗量。都好。如果我一遍又一遍地加载相同的文件,内存使用量会不断增长(我正在查看顶部的 RES 列,Linux)直到大约 700MB。这可能表明内存泄漏。但是,如果我继续加载文件,内存消耗将保持在 700MB。

另一件事:当我使用 valgrind massif 并查看内存使用情况时,它始终保持在预期的限制内。例如,如果我将缓存大小指定为 1.5 GB 并单独运行我的程序,它最终会消耗 4GB 的内存。如果我在地块中运行它,它将一直保持在 2GB 以下,然后在生成的图表中我将能够看到它实际上从未分配超过预期的 1.5GB。我幼稚的假设是,发生这种情况是因为 massif 使用了一个自定义内存池,它以某种方式防止了碎片。

那么你认为这里发生了什么?如果是内存碎片,我应该寻找什么样的解决方案来解决这个问题?

0 投票
2 回答
521 浏览

.net - 使用 MSMQ 异步 IO 时的 .NET 堆碎片

我有一个从大量 MSMQ 队列(目前大约 10000 个)读取的应用程序。我使用queue.BeginPeekUInt32.MaxValue 超时从队列接收消息。当消息出现在队列中时,我对其进行处理并queue.BeginPeek再次调用。所以我听所有的队列,但是消息处理是在线程池上完成的。

我注意到内存使用量缓慢增长(两周的工作导致从 200 MB 增长到 800 MB)。在调查了转储文件后,我看到了带有许多空闲对象的典型堆碎片图片(其中一些有大约几兆字节的大小)。并且孔之间有固定的物体。

在处理创建固定对象的非托管代码调用时,这似乎很常见。但是我在互联网上没有找到任何解决方案。

.NET 中的内存管理是否如此纯粹,以至于它甚至不允许完成如此简单的场景,或者我错过了什么?

编辑:我对示例应用程序进行了一些调查。在为新对象分配内存时,固定对象之间的空洞(空闲内存区域,所谓的空闲对象)被 GC 重用。但是在我的生产应用程序中,固定对象是长期存在的,它们最终出现在第二代,它们之间有孔(因为 GC 只是移动了分隔代的边界)。由于我几乎没有正常的长寿命对象,因此我在转储文件的第二代中看到了这个漏洞。

所以我的应用程序的内存消耗可以增长到 10000*(孔的平均大小)。(10000 是将来还可以增加的队列数)。我目前不知道如何解决这个问题。唯一的方法是不时重新启动应用程序。

再一次我只能问,为什么 .NET 没有用于固定对象的单独堆?(也许这是新手问题)。目前我看到调用使用非托管代码的异步操作可能会导致内存问题。

0 投票
1 回答
969 浏览

c++ - 是否可以解决 CUDA 内存碎片问题?

我正在尝试分配一些内存,但有时会出现“内存不足”错误。cudaMemGetInfo说我需要更多可用的内存。所以,内存碎片问题。有可能解决这个问题吗?是否可以将元素放在内存中而不是一个一个地放置在我可以放置在内存中的几个和平中?