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

memory - Erlang内存碎片

我们的 Erlang 服务器看起来有严重的内存泄漏,VM 内存使用率低但 top 高。

环境

Erlang: R16B02 OS: Ubuntu 12.04.5 LTS \n \l X86_64

二郎虚拟机

分配的内存

分配二进制

做垃圾

碎片化

我检查recon_alloc:fragmentation(current)recon_alloc:fragmentation(max)发现一些分配器的当前使用量低于最大使用量。

当前使用情况

最大使用量

这是否意味着 Erlang 服务器有很多内存碎片,我该如何继续?

0 投票
1 回答
55 浏览

vb.net - 如何发送文件而不用担心内存碎片?

我有一个简单的 VB.NET Web 应用程序,它允许用户下载服务器硬盘上的特定文件。但是,其中一些文件非常大,最大可达 1GB。有时,当 Web 应用程序尝试发送这些文件时,应用程序会出错并抛出System.OutOfMemoryException. 经过一番研究,我发现这是由于内存碎片,或者没有足够的连续内存来为整个文件分配。

有什么办法可以避免这个错误的发生吗?我们的服务器总体上有足够的物理内存来分配下载这些大文件,这只是内存碎片的问题(无论如何我在互联网上读过)。

作为参考,这里是当前的代码:

... 其中fileName是文件的名称,contentType是 MIME 类型,fileLocation是磁盘上的物理位置。

有什么建议么?

0 投票
2 回答
1185 浏览

c# - 连接或添加字符串但不是使用 string.Format 时出现内存碎片?

所以大学的一位教授刚刚告诉我,在 C# 中对字符串使用连接(即当你使用加号运算符时)会产生内存碎片,我应该使用它string.Format

现在,我在堆栈溢出中进行了很多搜索,并且发现了很多关于性能的线程,其中连接字符串胜出。(其中一些包括这个这个这个

不过,我找不到谈论内存碎片的人。我string.Format使用 ILspy 打开了 .NET,显然它使用了与该方法相同的字符串生成器string.Concat(如果我理解这是+符号被重载的内容)。事实上:它使用string.Concat!

我从 2007 年发现这篇文章,但我怀疑它今天(或永远!)是否准确。显然编译器足够聪明,今天可以避免这种情况,因为我似乎无法重现这个问题。使用 string.format 和加号添加字符串最终在内部使用相同的代码。如前所述,string.Format 使用与 string.Concat 相同的代码。

所以现在我开始怀疑他的说法。这是真的吗?

0 投票
2 回答
6701 浏览

c - 内存碎片

当我随机使用malloc()s 和free()s ,嵌套和不同大小时,在某些时候内存会被碎片化,因为这些操作会留下一大堆不连续的小内存区域,因此不能分配为更大的一块.

关于这个的几个问题:

  • 如果经常这样做以致内存被迫碎片化,然后所有这些内存区域都是free()d,我可以假设这些空闲区域连接回其原始的连续大小吗?

  • 当我总是对相同的内存执行 a 并且从不嵌套这些调用时,当分配/释放的大小总是不同时,在这种情况下内存是否也会碎片化malloc()free()

0 投票
0 回答
516 浏览

process - Linux oom 杀手 - 查找碎片化进程

从 Debian 7 升级到 Debian 8 on arm (cubietruck) 后,我目前面临 OOM 的主要问题。我已经阅读了很多关于 oom 机制和原因的内容,但我仍然想念一个答案

如何找到正在运行的进程的内存碎片?

我已经 cat-ed /proc/buddyinfo 并看到碎片上升到 oom 杀死进程的那一刻。但这仅适用于整个系统。是否有可能在每个进程基础上获取 buddyinfo 之类的信息?

PS:我假设某些进程创建(通过 kmalloc?)碎片或通过其运行时行为触发内核中的碎片内存(缓冲区,控制结构或其他......)


cubietruck系统具有 2GB RAM 和 4GB 交换空间。

0 投票
1 回答
976 浏览

c++ - 内存碎片会减慢 New/Malloc 的速度吗?

简短的背景:

我正在开发一个应该运行数月并使用动态分配的系统。

问题:

我听说内存碎片newmalloc操作员会减慢速度,因为他们需要在我留在内存中的“洞”之一中“找到”一个位置,而不是简单地在堆中“前进”。

我读过以下问题: 什么是内存碎片?

但是没有一个答案提到任何关于性能的东西,只有分配大内存块的失败。

那么内存碎片是否会new花费更多时间来分配内存?如果是,多少?我怎么知道new在堆上查找内存是否“困难”?

我试图找出 GCC 使用哪些数据结构/算法来在内存中找到要在内部分配的“洞”。但找不到任何血统解释。

0 投票
1 回答
315 浏览

json - Arduino Mega 在 4 小时后减速

我正在做一个小项目,向网络服务器发出一些 POST 请求并根据服务器响应执行一些任务。服务器总是以 JSON 或数组响应

来自服务器的 Clasic 响应如下所示:

问题是,在完美运行 4 小时后,我的 arduino mega 运行非常缓慢。第一次,只需 10-20 毫秒即可检索命令并执行任务(打开 LED 电源)。现在,4 小时后,为同一个 LED 供电大约需要 5 秒。我看到以太网指示灯正在缓慢闪烁。我猜是因为我使用了一些 const char* 来存储服务器响应。我的问题是,在循环函数的末尾,像 const char* 这样的变量被删除了吗?几个小时后我的arduino运行如此缓慢是什么原因?谢谢

在循环函数中运行的代码:

从 tcp 响应中删除标头的功能

0 投票
1 回答
7290 浏览

memory-management - 如何处理外部碎片,分页如何帮助处理外部碎片?

我知道关于我在这里指出的问题有很多问题,但我找不到任何复杂的答案(无论是在 StackOverflow 上还是在其他来源中)。

我想问一下堆(RAM)碎片问题。

据我了解,有两种碎片: 内部- 与分配单元大小 (AU) 和分配的内存 AM 大小之间的差异相关(浪费内存等于 AM % AU), 外部- 与空闲区域的非连续区域相关内存,因此即使空闲内存区域的总和可以处理新的分配请求,如果没有可以处理的继续区域,它也会失败。

这很清楚。当“分页”出现时,问题就开始了。

有时我可以找到分页解决外部碎片问题的信息。事实上,我同意,由于分页,操作系统能够创建内存的虚拟连续区域,分配给进程,即使内存的各个部分在物理上是分散的。

但它究竟对外部碎片有什么帮助呢? 我的意思是,假设一个页面的大小是 4kB,而我们要分配 16kB,那么我们当然只需要找到四个空页面框架,即使这些框架在物理上不是连续区域的一部分。

但是在较小的分配情况下呢? 我相信页面本身仍然可能是碎片化的,并且(在最坏的情况下)如果旧框架不能用于分配请求的内存,操作系统仍然需要提供新框架。

那么(假设最坏的情况)迟早,无论有没有分页,分配和释放堆内存(不同大小)的长时间工作的应用程序会因为外部碎片而陷入低内存状态?

那么问题是如何处理外部碎片? 自己实现分配算法?分页(正如我所写,不确定是否有帮助)?还有什么 ?操作系统(Windows、Linux)是否提供了一些碎片整理方法?

最激进的解决方案是禁止使用堆,但是对于具有分页、虚拟地址空间、虚拟内存等的平台真的有必要吗……唯一的问题是应用程序需要不间断地运行多年?

还有一个问题..内部碎片化是一个模棱两可的术语吗? 我在某个地方发现了内部碎片指向页面框架部分的定义,这是浪费的,因为进程不需要更多内存,但是单个框架不能由多个进程拥有。

我把问题加粗了,所以赶时间的人不用阅读所有内容就可以找到问题。

问候!

0 投票
1 回答
138 浏览

memory-management - 内部碎片化基本概念

假设我有两个 50 字节的进程并且只有一个 100 字节的分区。假设第一个进程占用了分区,还剩下 50 个字节。即使有可用空间,第二个进程是否可以驻留在同一个分区中,还是会发生内部碎片?

如果存在内部碎片,那么是否也存在外部碎片?

0 投票
2 回答
493 浏览

linux - massif 报告的堆使用量比 VmRss 少得多,这可能是什么问题?

地块输出:

进程在VmRss中显示1.2GB,那么巨大的差异来自哪里?(我看到 Rss 不断增长)。