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

java - 一个示例测试 java 代码,可以演示堆中的内存碎片

我想通过在 java 用户空间中编写一些错误的代码来了解内存碎片是如何发生的。

请指出一些可以帮助我理解这一点的想法。

在我的理解中,我的想法是,Java 堆碎片只会因为垃圾收集错误而发生,但我的一些朋友却持相反的观点。

我只是想了解编写糟糕的 Java 代码应用程序也会发生 Java 堆碎片。

注意:我正在寻找可以证明这个论点的代码片段。


更新:

实际上,我们在嵌入式设备中拥有的 jvm 是 java 1.3。

谢谢,

0 投票
4 回答
256 浏览

c++ - 使用包含指针的向量还是值向量(以避免堆碎片)更好?

我知道许多关于避免堆碎片的文章。我的问题与我们使用向量存储数据时发生的具体情况有关:

我使用 new 或 delete 没有问题(我没有内存泄漏,当不使用 bar 时我很清楚,我可以在必要时调用 delete)。但是关于堆碎片,哪个更好?这是否使堆栈溢出的可能性更大?

编辑:我实际上没有任何新信息要添加。我只是想感谢大家,并说我发现任何带有 C++ 标记的问题似乎都会吸引这么多知识渊博的乐于助人的人。它真的很不错。谢谢你。

0 投票
1 回答
574 浏览

c++ - 重新分配内存以避免内存碎片

这是一个解释问题的简单示例(使用 c++):

假设一个A对象的大小是3,一个B对象的大小是4,我的堆的大小是12,删除a2后,内存是这样的:

XXX---XXX---

B* b即使有足够的内存,我也无法创建对象,因为它不是连续的。

只是一个简单的内存碎片示例。

我可以通过创建某种reallocate()函数来动态避免这种情况,该函数将“移动”对象的内存a3并将其放在 a 之后:

XXXXXX-----

该函数显然应该在删除后调用a2,所以也许重新实现deallocate()或者delete()可以做到这一点,请问我该怎么做?

这只是一个非常简单的例子来展示我正在处理的问题

0 投票
1 回答
1067 浏览

java - 了解 Hotspot JVM 进程的内部碎片属性

对于堆上和堆外分配。On-heap - 在三个主要垃圾收集器的上下文中:CMS、Parallel Old 和 G1。

目前我知道(或认为我知道)的:

  • 所有对象(堆上)分配都四舍五入到 8 字节边界(或 2 的更大幂,由-XX:ObjectAlignmentInBytes.
  • G1
    • 对于小于区域大小(1 到 32 MB,可能在堆大小/2048 左右)的堆上分配,没有内部碎片,因为没有必要,因为分配器从不“填充漏洞”。
    • 对于区域大小较大的分配,它会将分配向上舍入到区域大小。IE。区域大小 + 1 字节的分配是非常不幸的,它几乎浪费了 50% 的内存。
  • 对于 CMS,我发现的唯一相关信息是

    自然旧空间 PLAB 模仿索引空闲列表空间的结构。每个线程预先分配一定数量的每个大小低于 257 个堆字的块(从全局空间分配的大块)。

    来自http://blog.ragozin.info/2011/11/java-gc-hotspots-cms-promotion-buffers.html。据我了解,所谓的“全球空间”是主要的旧空间。

问题:

  • 上述说法是否正确?
  • CMS中主要旧空间的碎片属性是什么?超过“257 个堆字”的分配怎么办?
  • Parallel Old GC 如何管理旧空间?
  • Hotspot JVM 是使用系统内存分配器进行堆外分配,还是使用特定的分配器重新管理它?

UPD。讨论主题:https ://groups.google.com/forum/#!topic/mechanical-sympathy/A-RImwuiFZE

0 投票
1 回答
1447 浏览

c++ - 避免堆碎片的最佳 STL 容器

我有一个分析 150,000 个文件的程序。Valgrind 报告没有内存泄漏,但程序会随着时间的推移而变慢。

一些问题与过于频繁地使用 std::string 和 mktime 花费太多时间有关。(请参阅C++ 随着时间的推移会减慢读取 70,000 个文件

但随着时间的推移,它仍然会变慢。 Lotharyx建议容器使用导致堆碎片。

我阅读了关于不同 STL 容器优缺点的各种流程图,但我不太明白。

在下面的伪代码中,我不确定我是否做出了正确的选择来避免堆碎片。

上面的序列永远重复。

因此,对于容器的选择,我使用(或需要):

fileList-- 包含 150,000 个路径名的唯一字符串列表。
我选择 std::set 是因为它会自动处理重复项并自动维护排序顺序。没有随机访问,只添加条目,对它们进行排序(手动或自动),然后迭代它们。

fileInfoMap-- 由与文件日期相对应的 time_t 时间戳键入的结构数组。我选择了std::map。它也将有 150,000 个条目,因此会占用大量内存。没有随机访问,只将条目添加到一端。必须遍历它们,并在必要时从中间删除条目。

eventList-- 一小部分“事件”结构,比如 50 个项目。我选择了 std::vector。不知道为什么真的。没有随机访问,只在一端添加条目,然后遍历集合。

我对 C++ 相当陌生。感谢您的考虑。

0 投票
2 回答
2603 浏览

c# - 强制 .NET GC 压缩或整理第 2 代堆?

我们在 .NET 框架中使用 C# 编写了一个 Windows 服务,几个小时后我们注意到第 2 代堆的大小变得异常。大部分空间都是免费的,dotMemory Profiler 向我们展示了这一代我们有大约 90% 的碎片。如何强制 .NET GC 压缩这个空间?这意味着 GC 可以释放这个空间,但它不能压缩它以供进一步使用。

0 投票
1 回答
1829 浏览

c# - 如何解决 Gen2 堆碎片

我正在运行一个为 HTTP 请求提供服务的 C# 应用程序。我最近注意到它占用的内存比我预期的要多。我抓了一些转储,在 Windbg 中弹出,发现大部分内存都标记为 Free:

因此转储约为 3GB,因此其中大约一半是可用内存。看着堆,我看到了这个:

所以我的小对象堆非常分散,特别是 Gen2。在服务器上,我可以看到正在发生 gen2 集合(使用性能计数器),但即使它们是,看起来 gen2 堆也没有被压缩。即使服务器上只有 1-2% 的 RAM 可用,gen2 堆也不会被压缩。

对我来说,看起来我正在承受这种内存压力,因为堆是碎片化的。但是我无法弄清楚为什么会发生碎片或为什么 gen2 无法被压缩。一些可用空间的大小为 6MB,所以我认为它肯定会压缩这些空间。

谁能给我一些关于如何弄清楚为什么我的堆如此分散的想法?我什至在这里吠叫正确的树吗?

任何帮助将不胜感激,谢谢!

编辑1:

细分!gchandles为:

0 投票
0 回答
1081 浏览

c++ - 长时间应用程序运行时的 Windows 10 内存碎片

我们在 32 位应用程序(基于 C++ 和 WPF)中面临内存碎片问题。当我们运行它 100 小时。作为自动化测试的一部分。运行 AST 约 14 小时后应用程序崩溃。

我们使用 CRT 堆和 LFH 策略(低片段堆)在Main(). 问题出现在 Windows 10 平台上。在 Windows 8 平台上使用相同的应用程序二进制文件集没有问题。我们完成了 100 小时。在 windows 8 平台上运行测试。

我们在方法中创建了一个大块堆,Main()当我们需要大量内存并且我们在代码中管理它时,我们将这个堆用于特定目的。从虚拟内存统计日志中,我们可以看到初始虚拟内存分配为 1.79 GB。

14 小时后。自动化测试运行:在 Windows 10 上

在 Windows 8 上运行 100 小时。

  • 组合可用 = 1881204960(1794.057 MB)

  • 组合最大可用 = 1734127616(1653.793 MB)

  • 综合碎片百分比 = 7.82%

  • VM:sum_free = 1845817344(42.98%,1760.309 MB)

  • 虚拟机:max_free = 1734127616(1653.793 MB)

我们正在使用 ADPlus 和(Windows、Windbg 和 DebugDiag 的调试工具)工具以 3 小时的间隔收集内存转储。

是否有任何我需要启用的设置或标志,或者我必须使用 VS2010 对代码做的任何事情。

应用程序基于 Windows 10 LTSB 64 位(这是非常具体的 Windows 10 企业操作系统版本,提供稳定性和安全性)

0 投票
1 回答
291 浏览

.net - 由于固定对象,.NET LOH 上的碎片

我正在对使用 .net 4.5 Asp.net + Unity 3.0.1304.1 + Nhibernate 3.3.1.4 编写的应用程序进行故障排除,该应用程序的内存消耗达到 3 到 5 GB,高于预期。

在收集了一些内存转储后,很明显大对象堆上有碎片。

我的第一个想法是将应用程序更新到 .net 4.5.1 并告诉 GC 压缩 LOH,但我注意到固定对象数组的数量,这导致了一个演示应用程序可以得出结论,堆压缩不是在固定对象场景中很有帮助,并且在没有固定对象时甚至没有必要,因为没有碎片。

所以我试图跟踪这个固定的对象并遇到了这个问题,据说静态成员负责那些固定的对象并且句柄位于高频堆上。

我的问题是:

  • 我该如何继续尝试解决碎片问题?
  • 由于我从 WinDbg 知道的命令不起作用,如何获得有关高频堆的更多信息?

以上来自windbg的一些打印:

0 投票
0 回答
42 浏览

c++ - log4cpp 是否处理堆碎片问题?

我使用 VS2015 在 Windows 64 位上开发。

我使用了一个自定义记录器,但它遭受了堆碎片的影响。我找到了log4cpp图书馆。根据它std::ostringstream内部使用的源代码。我的问题:

  • 我认为我的主要问题是我可以log4cpp安全地使用而不担心堆碎片吗?
  • 第一个问题可能会引出以下问题:std::ostringstream内部如何防止堆碎片?它是否在堆栈中有多个缓冲区用于小字符串,还是总是在堆中分配一个新字符串?