问题标签 [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.
.net - 如何避免字符串导致碎片进入 LOH
我的应用程序从进入大型对象堆的文本文件中读取大量数据,最终导致碎片问题。是否有任何替代设计方法可以帮助不将这些带到 LOH?我知道 StringBuilder 但似乎从文本文件中读取仍然在内部将大字符串创建到 LOH 中。
memory-leaks - 故障转储中过多的第 2 代空闲块
在检查故障转储文件以查找客户端报告的内存不足异常时,结果!DumpHeap -stat
显示 45,000 个“免费”类型的对象占用了 575MB 的内存,我认为其中大部分必须驻留在第 2 代中,原因是规模。
我首先寻找问题的地方是大对象堆 (LOH) 和固定对象。包含可用空间的大型对象堆只有 70MB,所以这不是问题,运行!gchandles
显示:
与空闲对象的数量(45,000)相比,这是非常少的句柄(大约 600)。对我来说,这排除了由固定引起的空闲块。
我还查看了空闲块本身,看看它们是否具有一致的大小,但经过检查,大小差异很大,从不到 5MB 到只有大约 12 个字节左右。
任何帮助,将不胜感激!我不知所措,因为存在碎片,但没有迹象表明它是由我知道要查看的两个地方引起的,即大对象堆 (LOH) 和固定句柄。
c - 如何获得可以分配的最大可用内存块?
如何获得我的应用程序可以在一次malloc
调用中分配而不返回的最大大小(连续) out of memory
?(最大可用块)
PS:如果我想分配它和不想分配它,我想要一个一般性的答案(所以这个问题不需要重新提出)。
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# - SharpDX 内存碎片
我正在开发一个 .NET 3.5 应用程序,它使用 SharpDX 来渲染平铺的 2D 图像。
纹理 (Texture2D) 按需加载到缓存中,并在托管池中创建。
不再需要纹理时会丢弃纹理,并且我已验证正确调用了 Dispose()。SharpDX 对象跟踪表明没有最终确定的纹理。
问题是纹理使用的大量非托管堆内存在处理后继续保留。加载新纹理时会重用此内存,因此不会泄漏内存。
但是,应用程序的另一部分也需要大量内存来处理新图像。因为这些堆仍然存在,即使纹理已被释放,也没有足够的连续内存来加载另一个图像(可能是数百 MB)。
如果我使用 分配非托管内存AllocHGlobal
,则生成的堆内存在调用后会再次完全消失FreeHGlobal
。
VMMap 在应用程序大量使用后显示非托管堆(红色)。
我们可以在这里看到非托管堆占 ~380MB,尽管此时实际上只提交了 ~20MB。
从长远来看,该应用程序正在移植到 64 位。但是,由于非托管依赖关系,这并非微不足道。此外,并非所有用户都在 64 位计算机上。
编辑:我已经汇总了该问题的演示 - 创建一个 WinForms 应用程序并通过 Nuget 安装 SharpDX 2.6.3。
Form1.cs:
SharpDXRenderer.cs:
因此,我的问题是 - (如何)在处理纹理后回收这些非托管堆消耗的内存?
jvm-hotspot - 如何测量 Hotspot 元空间中的碎片?
我正在研究在我的应用程序中调试“OutOfMemoryError: Metaspace”错误。在 OOME 之前,我在 gc 日志中看到以下内容:
据我所见,元空间容量甚至没有接近承诺的大小(在这种情况下,-XX:MaxMetaspaceSize=768m
)。所以我怀疑元空间的碎片导致分配器无法为新的类加载器找到新的块。
我知道,-XX:PrintFLSStatistics
但这仅涵盖 CMS,而不是本机内存。
所以我的问题是:有没有类似于PrintFLSStatistics
Hotspot 原生内存的调试帮助?
这是对 linux-amd64 JRE (1.8.0_45-b14) 使用 Java HotSpot(TM) 64 位服务器 VM (25.45-b02)。
linux - 在具有 2^20 字节物理内存和 4KB 页面大小的 32 位系统上,页帧号需要多少位?
在具有 2^20 字节物理内存和 4KB 页面大小的 32 位系统上,页帧号需要多少位?
是11位吗??
需要答案请帮忙!谢谢你。
c++ - 提升 multi_index_container 和内存碎片
我在服务器中使用 MIC 作为我的 LRU 缓存,它已经替换了列表/映射 LRU,因为我怀疑这是导致一些无法解释的内存占用的原因。内存泄漏是不可能的,至少没有工具发现任何泄漏以及代码检查。自从我开始使用 MIC 后,图片有所改善(这是内存碎片的唯一证据),但还不够。我们谈论的是几 Gb 的缓存,每天有数百万条记录从其中弹出。两到三周后,问题变得清晰起来——如果我清空缓存,该进程仍会保留无法解释的 2-3Gb 内存。
我的容器很简单:
它使用erase
andpush_front
插入新条目(或覆盖旧条目),然后在需要时从尾部弹出元素。问题是是否值得尝试使用replace
andrelocate
而不是push_front
?
UPDATE001:好的,新版本已经启动并运行,我看到重新分配显着改善了这种情况,3 周后的内存占用比没有更改的机器上的占用少约 1/1.5 Gb。现在它部署在全球所有机器上。作为第二阶段,缓存失效机制有很多变化。更少的弹出和重新插入也应该改善这种情况(如果它真的是内存碎片)
linux - Redis used_memory_rss 是否超过配置集'maxmemory'?
我们在 Redis 服务器中设置了 120 GB 最大内存。
所以在信息输出中 used_memory 总是小于等于 120GB 但 used_memory_rss 是 ~140GB
有人可以解释一下这个原因吗?
android - 如果 totalMemory 很小,但 totalPss 很大,这是什么意思?
我们的应用程序有问题。随着时间的推移,我们注意到该totalPss
值变得非常大(取决于设备,它将是 300-700Mb):
这是一个显示典型运行结果的图表:
但是,与此同时,该totalMemory
值永远不会变得非常大(最大为 40-50Mb,但在 GC 后降至 10Mb)。
这是一个图表,显示与上面相同的运行(请忽略单位,它实际上以字节为单位):
getMemoryClass
对于此设备,表明我们有 192Mb 可用于该应用程序:
我们的内存使用模式是随着时间的推移进行大量频繁释放的大分配。很长一段时间后,大量分配将失败,这通常会导致应用程序失败。
看起来我们可能有碎片,这看起来正确吗?我们可以通过使用largeHeap
属性来解决这个问题吗(我的直觉是它不会)?是否有任何工具可以帮助更确定地诊断这一点?