问题标签 [large-object-heap]
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.
c# - 计算大字符串的哈希时如何避免分配大字节[]
我的任务是在我的应用程序中消除对大对象堆的所有(或尽可能多的)分配。最大的违规者之一是我们计算大字符串的 MD5 哈希的代码。
为了示例的缘故,字符串本身可能已经在 LOH 中。我们的目标是防止对堆进行更多分配。
此外,当前的实现假设 UTF8 编码(一个很大的假设),但真正的目标是从字符串生成一个 byte[]。
MD5CryptoServiceProvider 可以将 Stream 作为输入,因此我们可以创建一个方法:
这是有希望的,因为我们不需要 byte[] 来让 ComputeHash 工作。我们需要一个流对象,它将在 ComputeHash 请求字节时从字符串中读取字节。
这个颇具争议的问题提供了一种从字符串创建字节数组的方法,而不管编码如何。但是,我们要避免创建大字节数组。
这个问题提供了一种通过将字符串读入 MemoryStream 来从字符串创建流的方法,但在内部也只是分配了一个大的 byte[] 数组。
两者都不是真正的伎俩。
那么如何避免分配大字节[]呢?是否有一个 Stream 类会在读取字节时从另一个流(或读取器)读取?
.net - PerfView 可以用于查找碎片来源吗
我发现 PerfView 是确定各种类型问题的根本原因的非常有用的工具。但是我不确定它是否也可以用来诊断 LOH 碎片问题。我使用 PerfView 收集了一个进程内存快照。在过去的这个过程中,我们观察到了 LOH 碎片,但当时我曾经从 !heapstat 命令中获取值。任何人都知道 PerfView 是否可以帮助确定:
- LOH 的碎片化程度有多严重
- 哪些对象可能导致这种碎片
.net - 如何避免字符串导致碎片进入 LOH
我的应用程序从进入大型对象堆的文本文件中读取大量数据,最终导致碎片问题。是否有任何替代设计方法可以帮助不将这些带到 LOH?我知道 StringBuilder 但似乎从文本文件中读取仍然在内部将大字符串创建到 LOH 中。
.net - 获取 LOH 中的对象实例列表
我在托管堆中有数百个MyClass实例。其中一些在大对象堆中。下面是各种堆结构的外观
我的问题是
1. 如何找到大对象堆中所有MyClass实例的地址。2. 有没有办法在大对象堆中的MyClass
实例上运行 !ObjSize ?
json - 使用 JSON.NET 解析 1GB json 文件的问题
我得到了一个应用程序,其中输入已从 50K 位置记录扩大到 110 万条位置记录。这导致了严重的问题,因为整个文件以前被反序列化为单个对象。对于具有 110 万条记录的生产类文件,对象的大小约为 1GB。由于大型对象 GC 问题,我希望将反序列化对象保持在 85K 标记以下。
我试图一次解析出一个位置对象并对其进行反序列化,这样我就可以控制被反序列化的对象的数量,进而控制对象的大小。我正在使用 Json.Net 库来执行此操作。
下面是我作为流接收到我的应用程序中的 JSON 文件的示例。
我需要能够提取各个 Location 对象,以便查看以下内容
我正在尝试使用 Json.NET JsonTextReader 来完成此操作,但是我无法让阅读器在其缓冲区中包含整个位置,因为流中记录的大小阅读器最初将下降到“ RadioProtocols”,它位于对象的中间,当流到达对象的末尾时,阅读器已经丢弃了对象的开头。
我用来尝试使此功能正常工作的代码是
任何有关此或替代方法的信息将不胜感激。附带说明一下,我们的客户发送信息的方式目前无法改变。
c# - C# 过多的垃圾收集 - 大字符串,G2 压力?
我正在用 C# 编写一个高容量 Web 服务,该服务在 Win 2k8(.NET 4.5)上的 64 位 IIS 中运行,它与 XML 有效负载一起使用,并对小型和大型对象(主要是大型对象)执行各种操作字符串,一些超过 85k(所以进入 LOH))。请求是无状态的,并且内存使用随着时间的推移保持稳定。每个请求正在分配和释放大量内存,似乎没有内存泄漏。
每秒最多运行 25 个事务,平均调用持续 5 秒,根据两个分析工具,它在 GC 中花费了 40-60% 的时间,perfmon 在 5 秒内显示稳定的 20 次 G0 和 G1 收集,以及 15 G2 收集超过 5 秒 - 这意味着我们希望保留在 G0 中的数据有很多(我们认为)提前进入 G2。我读到的一切都表明这是非常过分的。我们预计系统应该能够以高于 25 tps 的吞吐量执行,并假设 GC 活动阻止了这种情况。
处理请求的机器有很多内存 - 16GB - 负载下的应用程序在负载下一个小时最多消耗 1GB。我知道更大的堆不一定会使事情变得更好,但是有备用内存。
我很欣赏这对细节很清楚(如果时间允许,将尝试用一个简单的应用程序重新创建条件) - 但谁能解释为什么我们看到如此多的 G2 GC 活动?我应该专注于 LOH 吗?人们一直告诉我 CLR 的 GC“适应”您的负载,但在这种情况下它并没有改变它的行为,而且与其他运行时不同,我似乎几乎无法调整它(尝试过工作站 GC,但有几乎没有可观察到的差异)。
c# - C# 中型集合中的大对象
我对内存问题很陌生。希望你不要认为这是一个愚蠢的问题。
我知道大于 85,000 字节的内存将被放入 C# 中的 LOH 中,即
我想知道大小为 10000 - 20000 且对象包含 10 个成员变量(字节类型)的集合是否会被放入 LOH 或 SOH 中?
.net - OutOfMemoryException 问题:有足够空间且没有 LOH 碎片时出现异常
我遇到了一些奇怪的 OutOfMemory 异常。
我们有一个应用程序,它基本上为来自某些硬件设备的数据绘制了一些图表。
如果我使用 MemoryProfiler 运行应用程序,一段时间后,我得到了一些OutOfMemoryException
. 我们知道,即使没有调试器,我们的一些客户也会发生同样的异常。
奇怪的部分:
- 我们还有足够的可用内存空间
- 出现此异常时,应用程序仅使用 360MB
我们正在使用 Nevron 库来绘制图表,我们得到的异常是:
我们将 DevExpress 用于应用程序的所有其他部分。我们也设法从他们那里得到了这个错误(我不确定他们是否相关,但我有他们的感觉):
我们有一个“捕获所有异常”处理程序,允许应用程序在异常发生后不关闭。目前这是对 GUI 的影响(它所在的位置取决于异常发生的位置:
这是崩溃时的 GDIView 情况(计数器一直在增加/减少,幅度不大,但通常,当 GC 运行时,我会回到 0 偏移量。):
我已经检查过的内容:
- ANTS 探查器不会警告我在此异常之前和之后拍摄的快照上的 LOH 碎片
- 我没有看到大的内存增加(内存泄漏)
- 我还有很多空间
- 我没有大量使用 GDI 句柄(使用GDIView检查)
我有点绝望,因为这个异常发生在我们的客户身上,在我的电脑上(我可以重现它,但不容易),但我不明白这里出了什么问题,我在互联网上发现的一切都是关于拥有 GDI句柄增长(或让另一个应用程序的 GDI 句柄增长),但似乎并非如此。
这个错误似乎总是发生在直接与 GUI 接触的东西上,即使当我们接收到数据时,我们也必须分配大数组(不是那么大,但经常)。
我该怎么做才能获得有关此异常的更多信息?
我已经发现的东西:
- TestLimit允许我创建超过 1600 万个新句柄
- 这个 SO question,但在这里我找不到增加句柄的线索
- 这篇文章,但我检查了,我所有的新文章
Graphic
都被处理掉了(不知道图书馆的那些 - LOH上的这篇文章,但是根据ANTS的说法,这似乎不是我的问题
我向 Nevron/DevExpress 报告了这个问题,但不确定他们是否能提供帮助,目前没有答案。
编辑
我确实设法让蚂蚁告诉我这个:
但是,我不确定我是否应该考虑它,因为不可用的空间非常低,而且我还有足够的内存空间(LOH 有大小限制吗?)
c# - 是否收集大对象堆
我找不到有关大对象堆的信息。到处都写着它不是碎片化的。但我听说那不是收集的。
我找不到可以为我提供此信息的文章。
那么,是否收集了 LOH(从内存中删除了死实例)?
c# - HttpWebResponses:MemoryStream.CopyTo 与分块的效率如何?
我在从 API 下载大型 JSON 对象时遇到问题。通常,这些文档很小,但有时它们会很大(100k+)。这使大对象堆发挥作用,并且存在一些性能问题。
这是返回响应字节的下载器方法的内容。
如果最终目标是将 webresponse 的内容放入字节数组中,这是最有效的方法吗?在过去,我只会分块读取流。有人告诉我,在 90% 的时间里(当 JSON 响应低于 85k 时),这比 CopyTo 效率低,但在另外 10% 的时间里效率更高。
我似乎无法就此达成普遍共识。任何输入将不胜感激。