问题标签 [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.
sos - 了解大对象堆和 DumpHeap 输出的统计信息
假设我有以下课程:
首先,我分配:
每个b1, c1, d1
都小于 85K,因此它们被分配在小对象堆上。然后我做:
问题1:我做!DumpHeap -stat
的时候mem的使用是否A
包括其成员变量所占用的内存?如果不是,它实际上包括什么?
编辑:在这篇文章中找到了这个问题的答案:http: //blogs.msdn.com/b/tess/archive/2005/11/25/dumpheap-stat-explained-debugging-net-leaks.aspx。有意义的是 mem 的使用A
不包括b1, c1, d1
. 它包括存储b1, c1, d1
引用本身所需的内存。
问题2:是否a1
在大对象堆上分配(假设大小b1 + c1 + d1
> 85K)?为什么?引用b1, c1, d1
指向小对象堆上的对象。那为什么会a1
坐在LOH上呢?
问题3:让我们翻转一下。说大小b1
超过85K,所以它分配在LOH上。但是要存储对我们的引用,b1, c1, d1
我们只需要几个字节。我相信a1
将在小对象堆上分配是正确的吗?
c# - 大对象堆碎片,数组问题
我正在用 C# 编写一个必须处理大量内存的分析应用程序。我使用 ANTS Memory Profiler 7.4 来优化我的内存管理。这样做时,我意识到我使用的所有 double[,] 数组(并且我需要它们)都放在 LOH 上,尽管这些数组中最大的大约是 24.000 字节。据我所知,对象不应该放在 85.000 字节之前。现在的问题是,由于我有大约数千个这些 double[,] 数组的实例,我有很多内存碎片(我的总内存使用量中约有 25% 是我无法使用的空闲内存)。其中一些存储在 LOH 上的数组甚至只有 1.036 字节大小。问题是,有时我必须执行更大规模的分析,然后由于 LOH 碎片导致大量内存丢失,最终导致内存不足异常。
有谁知道为什么会发生这种情况,尽管根据定义它不应该是一个大对象?
c# - 如果我使用 MemoryStream 存储半 GB 的数据块然后丢弃它,它会有什么长期影响?
在我的 Azure 角色中,我想在 64 位进程中运行 C# 代码,我想下载一个 ZIP 文件并尽快解压缩它。我想我可以执行以下操作:创建一个MemoryStream
实例,下载到该实例,MemoryStream
然后将流传递到某个 ZIP 处理库进行解包,一旦解包完成,丢弃流。这样我就可以摆脱不必要地执行大量 I/O 的写-读-写序列。
但是我读过它MemoryStream
是由一个数组支持的,半 GB 的数组肯定会被认为是一个“大对象”,并将分配在一个不会在垃圾收集上压缩的大对象堆中。这让我担心,也许这种使用MemoryStream
会导致进程内存碎片化和负面的长期影响。
这可能会对我的流程产生任何长期的负面影响吗?
.net - 在 C# 中进行大量、快速和频繁的内存分配期间避免 OutOfMemoryException
我们的应用程序不断地为大量数据(比如数十到数百兆字节)分配数组,这些数据在被丢弃之前的生存时间很短。
天真地这样做可能会导致大对象堆碎片,最终导致应用程序崩溃并出现 OutOfMemoryException,尽管当前活动对象的大小并不过分。
过去我们成功管理此问题的一种方法是将数组分块以确保它们不会最终出现在 LOH 上,其想法是通过允许垃圾收集器压缩内存来避免碎片。
我们最新的应用程序处理的数据比以前更多,并且在托管在单独的 AppDomain 或单独的进程中的加载项之间非常频繁地传递这些序列化数据。我们采用了与以前相同的方法,确保我们的内存始终被分块,并非常小心地避免大型对象堆分配。
但是,我们有一个必须托管在外部 32 位进程中的加载项(因为我们的主应用程序是 64 位的,并且加载项必须使用 32 位库)。在特别重的负载下,当大量 SOH 内存块被快速分配并在不久之后被丢弃时,即使我们的分块方法也不足以保存我们的 32 位加载项,它会因 OutOfMemoryException 而崩溃。
在发生 OutOfMemoryException 时使用 WinDbg,!heapstat -inclUnrooted
显示如下:
!dumpheap -stat
显示这个:
这些告诉我,我们的内存使用并没有过多,而且我们的大对象堆像预期的那样非常小(所以我们绝对不会在这里处理大对象堆碎片)。
但是,!eeheap -gc
显示了这一点:
这里让我印象深刻的是,我们最终的 SOH 堆段从 0x73b41000 开始,这正好是我们 32 位加载项中可用内存的限制。
所以如果我没看错的话,我们的问题似乎是我们的虚拟内存已经被托管堆段碎片化了。
我想我的问题是:
- 我的分析正确吗?
- 我们使用分块避免 LOH 碎片的方法是否合理?
- 有没有一个好的策略来避免我们现在看到的内存碎片?
我能想到的最明显的答案是池化和重用我们的内存块。这可能是可行的,但我宁愿避免这样做,因为它涉及我们自己有效地管理那部分记忆。
c# - 实体框架、二进制数据和 LOH
我需要在数据库(MS SQL)中存储大量二进制数据,并通过 EF 与该数据库进行交互。不幸的是,EF 不支持 FILESTREAM(更准确地说,没有流支持)。
所以,我决定将数据存储在块中。Chunk 只是一个实体类型:
首先,我想通过某个最佳值来限制块大小,比如 1 Mb。
但后来我想起了大物体和 LOH。
据我了解,每个Chunk.Content
实例都将被视为具有以下后果的大对象(尤其是内存碎片)。Chunk
因此,最终会导致对象的密集创建OutOfMemoryException
(它是“24/7”应用程序,使用该二进制数据是应用程序的主要目的)。
我不能为数据块重用任何缓冲区,因为我正在使用 EF...
我应该减小块大小,使其更低,然后是 85K?
或者是偏执狂?:)
wcf - 如何删除 ServiceHost 持有的大对象堆上的 Byte[]
我有一个 WCF 服务,它使用 HTTP 协议。当一个特别大的查询到达系统时,它会创建一个大的 Byte[],它通过缓冲区引导到 HttpChannelListener 并最终到达服务主机本身。即使在 WCF 事务完成后,它仍然存在。这反过来会导致大型对象堆碎片,最终导致应用程序抛出 OOM 异常。
这是 Byte[] 的路径:ServiceHost.channelDispatchers.items._items[0].listener.innerChannelListener.typedListener.bufferManager.innerBufferManager.bufferPools[13].pool.globalPool.items._array[0]
系统对事务使用缓冲的 WCF 通信以确保其可靠。
我能做些什么来防止这些大对象留在内存中吗?
asp.net - ASP.NET 中的大数组支持
最近有了 4.5 .NET 支持,用户可以为一个对象分配超过 2 GB 的内存。为此,用户可以在 app.config 文件中将 gcAllowVeryLargeObjects 设置为 true,这样就可以正常工作了。
但是,我很难为 ASP.NET 找到此设置。我有一个网站,我需要测试我们的网站是否真的支持它。我知道 VS 内置服务器是一个 32 位进程。因此,它的用户不能简单地启动网站并针对大型阵列对其进行测试。
这甚至可以用 ASP.NET 实现吗?我正在使用 IIS7 来托管我的网站。
c# - 从 WCF 返回大字节数组 - 内存问题
我需要从 WCF 服务器返回一个大字节数组。
问题是 - 为了返回这样一个数组 - 我需要创建一个 - 当创建这样一个数组时 - 它会自动进入大对象堆 - 这意味着当服务受到压力时 - 我遇到了一个真正的问题内存使用和管理。
我考虑过使用非托管内存来避免使用大型托管字节数组 - 但仍然 - 我如何从 WCF 服务返回这样的数组?
有什么方法可以从 WCF 服务返回字节“流”,但不包括实际创建托管字节数组?我知道 WCF 本身使用 BufferManager - 所以如果它只是读取我的非托管内存并在发送之前使用它的缓冲区管理来存储它 - 我希望不会有问题。
asp.net - ASP.NET 内存转储包含完整 html 页面的字符串是否正常?
我们有一种情况,ASP.NET 工作进程间歇性地使用 100% 的 CPU。在分析 perfmon 结果和内存转储后,我们看到垃圾收集器正在大量使用 CPU 时间的迹象。
使用 WinDbg,我们看到 LOH 充满了包含 HTML 页面的完整页面的字符串。字符串的!gcroot通常找不到任何根。问题是这在 ASP.NET 应用程序上是正常的还是对于我们构建网站的方式更具体?
需要注意的是,这个 ASP.NET 网站是一个基于 Sitecore 的网站。我们知道 Sitecore 会缓存 HTML 输出,但据我了解,Sitecore 不会缓存整个页面,而只会缓存渲染级别。
performance - StringHTTPMessageConverter 加载所有导致java堆跳转的字符集
我们有一个使用 Spring 3.1.0.Final 并部署在 WAS 6.1 上的 portlet 应用程序。
过去我们有多个使用 Spring MVC 的 portlet。这是 Spring 3 的第一个 portlet。我在代码的大部分地方都使用注释和自动装配。
当此应用程序部署在服务器中时,基本堆使用量增加了 25+ MB。
我使用 Jprofiler 进行了分析,发现 StringHTTPMessageConverter 正在将所有字符集加载到占用大约 14 MB 内存的内存中(com.ibm.nio.charset.Charset 占用内存)
因为它是一个 portlet 应用程序,所以我在我的配置中明确定义了 org.springframework.web.portlet.mvc.annotation.Ann otationMethodHandlerAdapter bean,而不是 org.springframework.web.servlet.mvc.annotation.Ann otationMethodHandlerAdapter
这是我迄今为止尝试做的
1) 更改 StringHttpMessageConvertor 设置
在我的配置中定义了以下 bean
没有运气。
2)我已经在我的配置文件中定义了。正如一些帖子中所建议的,我还通过注释掉标签来尝试上述配置。但没有运气。
3) 正如一些论坛所建议的那样,我尝试编写 BeanPostProcessor 但找不到 StringHttpMessageConverter 类。
我是否需要在我的配置中明确定义 org.springframework.web.servlet.mvc.annotation.Ann otationMethodHandlerAdapter?
我的问题是
1)有什么办法可以避免所有字符集加载到内存中?
2) 基堆中的 25 MB 跳跃也是合理的吗?Spring 3.1.0 通常的内存足迹是什么?
我已经没有想法了 任何有关微调 Spring 框架的帮助将不胜感激。
谢谢并恭祝安康
拉维格