Tag: 内存管理

如何确定.NET中复杂对象的大小?

有没有办法确定.NET中复杂对象的总大小? 此对象由其他对象组成,可能包含对其他复杂对象的引用。 此对象封装的某些对象可能是POD,其他对象可能不是。

C#中的每线程内存管理

继续从了解VS2010 C#并行分析结果的讨论,但更重要的是: 我有许多并行工作的线程(使用Parallel.For / Each),它们为小类使用许多内存分配。 这会在全局内存分配器线程上产生争用。 有没有办法指示.NET为每个线程预分配内存池并从该池中进行所有分配? 目前我的解决方案是我自己的内存池实现(全局分配的T类对象数组,它们在线程中循环使用),这有很大帮助,但效率不高,因为: 我不能指示.NET从特定的内存片分配。 我仍然需要多次调用new来为池分配内存。 谢谢, 哈

为什么在C#中允许“long”作为数组长度?

我想尝试分配一个40亿字节的数组,这是我的C#代码: long size = 4 * 1000; size *= 1000; size *= 1000; byte[] array = new byte[size]; 此代码在包含new的行上的System.OverflowException失败。 好的,结果是Length返回int ,所以数组长度也限制为int可以存储的内容。 那么为什么没有编译时错误,并且允许long作为分配时数组元素的数量?

如何获得C#中的总物理内存?

我使用GlobalMemoryStatusEx函数来检索有关内存的信息,但此函数无法正常工作。 它为所有属性返回0。 我不认为这个function在我的Windows 7环境中有效。 [StructLayout(LayoutKind.Sequential)] internal struct MEMORYSTATUSEX { internal uint dwLength; internal uint dwMemoryLoad; internal ulong ullTotalPhys; internal ulong ullAvailPhys; internal ulong ullTotalPageFile; internal ulong ullAvailPageFile; internal ulong ullTotalVirtual; internal ulong ullAvailVirtual; internal ulong ullAvailExtendedVirtual; } [return: MarshalAs(UnmanagedType.Bool)] [DllImport(“Kernel32.dll”, CharSet = CharSet.Auto, SetLastError = true)] internal static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer); private void […]

.NET可用内存使用(如何防止OS的内存/释放内存)

我目前正在开发一个大量使用缓存数据的网站,以避免往返。 在启动时,我们得到一个“大”图形(数百个不同类型的对象的thouthands)。 这些对象通过WCF检索并反序列化(我们使用协议缓冲区进行序列化)我正在使用redgate的内存分析器来调试内存问题(在我们完成之后,内存似乎与我们应该需要多少内存无关)初始化并以此报告结束 现在我们可以从这份报告中得到的结论是: 1)分配的大部分内存是免费的(它可能在反序列化期间被正确分配,但现在它是免费的,我希望它能够返回到操作系统) 2)内存碎片化(这很糟糕,因为每当我刷新现金时我需要重做内存饥饿的反序列化过程,这反过来会创建大型对象,由于碎片而可能抛出OutOfMemoryException) 3)我不知道为什么空间是碎片的,因为当我看到大对象堆时,只有30个实例,15个object []直接连接到GC并且与我完全无关,1也是char数组直接附加到GC堆,其余15个是我的,但不是原因,因为我得到相同的报告,如果我在代码中评论它们。 所以我的问题是,我该怎么做才能更进一步呢? 我不太确定在调试/工具中要找什么,因为看起来我的内存是碎片化的,但不是我,并且.net分配了大量的可用空间,我无法释放。 另外请确保你在回答之前理解这个问题,我不是在寻找一种方法来释放.net(GC.Collect)中的内存,而是释放已经在.net中释放的内存,以及系统以及对记忆进行碎片整理。 请注意,缓慢的解决方案很好,如果可以手动对大堆进行碎片整理,那么我可以在RefreshCache的末尾调用它,如果运行需要1或2秒,则可以。 谢谢你的帮助! 我忘记了一些注意事项:1)该项目是.net 2.0网站,我在.net 4池中运行相同的结果,如果我在.net 4池中运行它并将其转换为.net 4和重新编译。 2)这些是发布版本的结果,因此调试版本不是问题。 3)这可能非常重要,我在webdev服务器上根本没有得到这些问题,只在IIS中,在webdev中我的内存消耗量与我的实际消耗量相当接近(更多,但不是5-10倍! )

什么是“同步块”以及减少计数的提示

我们有一个使用(第三方)ActiveX控件的Windows窗体应用程序,并且在“.NET CLR内存”下的.NET性能对象中注意到正在使用的“同步块”的数量不断增加(以及增加的内存)用法),即使我们的应用程序闲置在那里。 接收器块计数的内置说明: 此计数器显示当前使用的同步块数。 同步块是分配用于存储同步信息的每对象数据结构。 同步块包含对托管对象的弱引用,需要由垃圾收集器进行扫描。 同步块不限于存储同步信息,还可以存储COM互操作元数据。 此计数器旨在指示大量使用同步原语的性能问题。 当我们切换到不同的应用程序时,同步块计数似乎确实会重置。 究竟是什么导致了这些创建,是否有减少这些数量的提示? (顺便说一句,它确实在性能计数器列表中拼写为“sink block”。我不确定它是否是一个错字或管道笑话)

在运行时轮询C#app的内存使用情况?

我有一个应用程序,在运行时,需要轮询自己的内存使用情况。 如果它可以列出实例化的每个对象的内存使用情况,那将是理想的。 我知道这可以通过WMI实现,但我希望有一些不依赖于WMI的东西。

以编程方式清除Windows 7备用内存

最近我的系统内存耗尽了一些问题。 花了一段时间才发现发生了什么,但我最终确定当我从文件共享中将大量数据复制到我的机器时,等待大量内存被放入“待机”状态。 任务管理器似乎没有显示备用内存使用情况,但资源监视器显示。 起初我只能通过重新启动来恢复内存,但最终我发现SysInternals的人已经编写了一个很棒的实用工具来释放内存(链接如下)。 以下是备用内存的简要介绍: 待机列表包含已从进程工作集中删除的未修改页面,这有效地使备用列表成为缓存。 如果进程需要待机列表中的页面,则内存管理器会立即将页面返回到其工作集。 待机列表中的所有页面都可用于内存分配请求。 如果进程请求内存,则内存管理器可以从待机列表中获取页面,对其进行初始化,并将其分配给调用进程。 这称为重新调整页面。 待机列表中的页面通常来自最近使用的文件。 通过将这些页面保留在待机列表中,内存管理器减少了从磁盘读取信息的需要。 磁盘读取会降低系统响应能力。 (这是来自这里的文件: 内存大小指导 以下是该工具的链接: RAMMap 我的问题是: 有没有人知道如何以编程方式? 理想情况下我想使用C#,但我会感谢任何可能帮助我得到答案的指针。 谢谢!

删除C#不安全指针

我知道在C#中使用/unsafe标志,你可以使用指针。 在C / C ++中删除指针你会使用free(pointer); 并delete pointer; 分别。 但是,如何使用C#指针实现相同的效果?

使用小数据类型(例如short而不是int)是否会减少内存使用量?

我的问题基本上是关于C#编译器如何处理小数据类型的内存分配。 我知道,例如add这样的运算符是在int上定义而不是在short上定义的,因此计算将被执行,好像short是int成员一样。 假设如下: 没有业务逻辑/validation逻辑与short作为数据类型的选择相关联 我们没有对不安全的代码做任何事情 是否尽可能使用短数据类型会减少应用程序的内存占用,是否建议这样做? 或者使用short等不值得努力,因为编译器例如分配int32的完整内存ammount并在进行算术时添加额外的强制转换。 任何关于假定的运行时性能影响的链接都将非常感激。 相关问题: 为什么我应该在C#中使用int而不是字节或short 整数蓝调,短+ +短问题