问题标签 [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.
java - 一个示例测试 java 代码,可以演示堆中的内存碎片
我想通过在 java 用户空间中编写一些错误的代码来了解内存碎片是如何发生的。
请指出一些可以帮助我理解这一点的想法。
在我的理解中,我的想法是,Java 堆碎片只会因为垃圾收集错误而发生,但我的一些朋友却持相反的观点。
我只是想了解编写糟糕的 Java 代码应用程序也会发生 Java 堆碎片。
注意:我正在寻找可以证明这个论点的代码片段。
更新:
实际上,我们在嵌入式设备中拥有的 jvm 是 java 1.3。
谢谢,
森
c++ - 使用包含指针的向量还是值向量(以避免堆碎片)更好?
我知道许多关于避免堆碎片的文章。我的问题与我们使用向量存储数据时发生的具体情况有关:
我使用 new 或 delete 没有问题(我没有内存泄漏,当不使用 bar 时我很清楚,我可以在必要时调用 delete)。但是关于堆碎片,哪个更好?这是否使堆栈溢出的可能性更大?
编辑:我实际上没有任何新信息要添加。我只是想感谢大家,并说我发现任何带有 C++ 标记的问题似乎都会吸引这么多知识渊博的乐于助人的人。它真的很不错。谢谢你。
c++ - 重新分配内存以避免内存碎片
这是一个解释问题的简单示例(使用 c++):
假设一个A
对象的大小是3,一个B
对象的大小是4,我的堆的大小是12,删除a2后,内存是这样的:
XXX---XXX---
B* b
即使有足够的内存,我也无法创建对象,因为它不是连续的。
只是一个简单的内存碎片示例。
我可以通过创建某种reallocate()
函数来动态避免这种情况,该函数将“移动”对象的内存a3
并将其放在 a 之后:
XXXXXX-----
该函数显然应该在删除后调用a2
,所以也许重新实现deallocate()
或者delete()
可以做到这一点,请问我该怎么做?
这只是一个非常简单的例子来展示我正在处理的问题
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
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++ 相当陌生。感谢您的考虑。
c# - 强制 .NET GC 压缩或整理第 2 代堆?
我们在 .NET 框架中使用 C# 编写了一个 Windows 服务,几个小时后我们注意到第 2 代堆的大小变得异常。大部分空间都是免费的,dotMemory Profiler 向我们展示了这一代我们有大约 90% 的碎片。如何强制 .NET GC 压缩这个空间?这意味着 GC 可以释放这个空间,但它不能压缩它以供进一步使用。
c# - 如何解决 Gen2 堆碎片
我正在运行一个为 HTTP 请求提供服务的 C# 应用程序。我最近注意到它占用的内存比我预期的要多。我抓了一些转储,在 Windbg 中弹出,发现大部分内存都标记为 Free:
因此转储约为 3GB,因此其中大约一半是可用内存。看着堆,我看到了这个:
所以我的小对象堆非常分散,特别是 Gen2。在服务器上,我可以看到正在发生 gen2 集合(使用性能计数器),但即使它们是,看起来 gen2 堆也没有被压缩。即使服务器上只有 1-2% 的 RAM 可用,gen2 堆也不会被压缩。
对我来说,看起来我正在承受这种内存压力,因为堆是碎片化的。但是我无法弄清楚为什么会发生碎片或为什么 gen2 无法被压缩。一些可用空间的大小为 6MB,所以我认为它肯定会压缩这些空间。
谁能给我一些关于如何弄清楚为什么我的堆如此分散的想法?我什至在这里吠叫正确的树吗?
任何帮助将不胜感激,谢谢!
编辑1:
细分!gchandles
为:
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 企业操作系统版本,提供稳定性和安全性)
.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的一些打印:
c++ - log4cpp 是否处理堆碎片问题?
我使用 VS2015 在 Windows 64 位上开发。
我使用了一个自定义记录器,但它遭受了堆碎片的影响。我找到了log4cpp
图书馆。根据它std::ostringstream
内部使用的源代码。我的问题:
- 我认为我的主要问题是我可以
log4cpp
安全地使用而不担心堆碎片吗? - 第一个问题可能会引出以下问题:
std::ostringstream
内部如何防止堆碎片?它是否在堆栈中有多个缓冲区用于小字符串,还是总是在堆中分配一个新字符串?