Tag: 内存管理

如何强制MemoryStream占用释放内存?

我有以下代码: const int bufferSize = 1024 * 1024; var buffer = new byte[bufferSize]; for (int i = 0; i < 10; i++) { const int writesCount = 400; using (var stream = new MemoryStream(writesCount * bufferSize)) { for (int j = 0; j < writesCount; j++) { stream.Write(buffer, 0, buffer.Length); } stream.Close(); } } 我在32位机器上运行。 […]

进程内存限制为64位进程

我目前有一个32位.Net应用程序(在x86 Windows上)需要大量内存。 最近它开始抛出System.OutOfMemoryException了。 所以,我打算将它作为64位进程转移到x64平台。 因此,这将有助于内存不足exception。 我正在从Windows的 MSDN 内存限制中阅读本文 所以,我的问题是如果我编译一个64位的.Net应用程序,它是否将IMAGE_FILE_LARGE_ADDRESS_AWARE设置为默认值(正如文章建议的那样)? 即我能够利用8GB用户模式虚拟地址空间吗?

类中声明的变量的内存分配

由于Value类型变量在Stack中分配内存,因为Reference Type在Heap中分配它。 那么在引用类型(例如,在类中)声明值类型变量(例如int i = 4;)时分配的内存如何。 整个内存分配如何在.net中用于值类型和引用类型,以及在refence类型范围内的值类型。 请解释或提供有关的任何链接。 谢谢

任务完成后C#不释放内存

以下代码是我看到的问题的简化示例。 由于字典太大,此应用程序在抛出exception之前会占用大约4GB的内存。 class Program { static void Main(string[] args) { Program program = new Program(); while(true) { program.Method(); Console.ReadLine(); } } public void Method() { WasteOfMemory memory = new WasteOfMemory(); Task tast = new Task(memory.WasteMemory); tast.Start(); } } public class WasteOfMemory { public void WasteMemory() { Dictionary aMassiveList = new Dictionary(); try { long i […]

发现内存泄漏

我有一个Web应用程序,我使用很多不同的第三方组件,CMS,当然还有我的代码。 由于某种原因,我失去了内存exception。 脚本抛出exception:内存不足 我试图找出发生了什么。 这是我发现的: 我用50个线程运行测试来调用我的web应用程序的15页。 记忆似乎很好。 IIS进程仅使用400 MB的RAM 我在web.config中添加了一个空格,突然间我的IIS进程在30分钟内开始增长到超过GB。 Visual Studio无法拍摄我的内存快照,因为它太大了(真的吗?!)所以我安装了ANTS内存分析器,但它说我的应用程序只使用了大约300 MB IIS进程需要1 GB pY.png 几分钟后我停止了测试,但内存没有释放。 (ANTS探测器停止工作,所以我重新启动它) 它似乎并不是应用程序特别使用100-200MB内存,我正在为我的控制器使用输出缓存。 我不明白的是,为什么IIS消耗的内存一直在增长,哪些是错的 更新 我的应用程序已自动重启,W3WP崩溃导致IIS释放内存,而我的压力没有运行一段时间: 应用程序:w3wp.exe Framework版本:v4.0.30319描述:由于.NET运行时在IP 5A3A86F1(5A0F0000)中出现内部错误,退出代码为80131506,该进程已终止。 和 错误应用程序名称:w3wp.exe,版本:10.0.15063.0,时间戳:0xacce422f错误模块名称:clr.dll,版本:4.7.2098.0,时间戳:0x59028d36exception代码:0xc0000005错误偏移量:0x002b86f1错误进程id:0x50a4错误应用程序启动时间:0x01d2ee688f323893错误应用程序路径:C:\ WINDOWS \ SysWOW64 \ inetsrv \ w3wp.exe错误模块路径:C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ clr.dll报告ID:4362ddc5-f8d7- 4441-8916-3830f9268b3a错误包全名:错误包相关申请ID: 更新2 我运行DebugDiag并且我已经对网站进行了压力测试,直到它消耗了大约3.5 GB的RAM。 Chakra是微软的图书馆。 所以现在我有2个问题。 是ChakraCore有泄漏还是正在使用/分配它? 如何定义哪个库? 2-它说27,000个分配。 这是否意味着内存中仍有27,000个或者其中一些可能被分配然后处理? 3-它仍然没有告诉我任何有关3GB消耗RAM的剩余部分。 它我总共只有600 […]

c#structs / classes stack / heap control?

所以在c ++中它很容易。 你想要在堆上分配任何类/结构,使用new。 如果你想要它在堆栈上,不要使用新的。 在C#中,我们总是使用new关键字,并且根据它是结构还是类,它在堆栈或堆上分配(结构转到堆栈,堆到类) – 在某些应用程序中可以有更改设计时的巨大性能差异,只有那些对象才能进入真正属于那里的堆。 我想知道的是 – 是否有一种直接的方法来控制对象的分配位置,与它是否被声明为struct或class无关? 我知道值类型(结构)可以装箱去堆(但装箱/拆箱会带来性能成本)。 有没有办法在堆栈上分配类? 此外,是否有任何机制来分配原始内存并使用像C ++中的placement new这样的东西? 我知道这打破了被管理的想法 – 但如果你可以使用自定义内存管理,它可以产生很大的性能差异。 我喜欢C#因为它的便利性,因为它是垃圾收集器和其他东西 – 但有时候,当处理应用程序的瓶颈时,可能希望能够更好地控制实际发生的事情。 任何提示/提示欢迎:) 编辑:性能示例: struct Foo1 { public int i; public float f; public double d; } struct Foo2 { public Foo1[] bar; public void Init(){ bar = new Foo1[100]; for (int i = 0; i […]

我如何说服我的同事不要在所有事情上实施IDisposable?

我正在开发一个项目,其中有大量的对象由一些类实例化,这些类在应用程序的生命周期内保留在内存中。 每次不时抛出OutOfMemoryExceptions都会导致大量内存泄漏。 似乎在实例化的对象之前超出范围之后,它们不会被垃圾收集。 我已经将问题分离为主要是关于附加到永远不会分离的长生命对象的事件处理程序,从而导致长生命对象仍然引用超出范围的对象,然后永远不会垃圾收集。 我的同事提出的解决方案如下:在所有类,全面和Dispose方法中实现IDisposable,使对象中的所有引用都为null,并从您附加到的所有事件中分离。 我相信这是一个非常糟糕的主意。 首先是因为它“过度杀伤”,因为问题可以通过修复一些问题区域来解决,其次因为IDisposable的目的是释放对象控制的任何非托管资源,而不是因为你不信任垃圾收集器。 到目前为止,我的论点都被置若罔闻。 我怎能说服他们这是徒劳的?

C#:如何实现智能缓存

我有一些地方可以实现某种缓存。 例如,在基于自定义字符串执行资源查找,使用reflection查找属性名称或每个属性名称只有一个PropertyChangedEventArgs 。 最后一个简单的例子: public static class Cache { private static Dictionary cache; static Cache() { cache = new Dictionary(); } public static PropertyChangedEventArgs GetPropertyChangedEventArgs( string propertyName) { if (cache.ContainsKey(propertyName)) return cache[propertyName]; return cache[propertyName] = new PropertyChangedEventArgs(propertyName); } } 但是,这会运作良好吗? 例如,如果我们有一大堆不同的propertyNames,那就意味着我们最终会有一个巨大的缓存,从来没有垃圾收集或任何东西。 我在想如果缓存的内容是更大的值,如果应用程序是一个长期运行的应用程序,这可能最终会成为一个问题……或者你怎么看? 如何实现好的缓存? 对于大多数用途,这个是否足够好? 一些很好的缓存实现的例子,这些实现不是很难理解,也不太复杂而无法实现?

Marshal.FreeHGlobal()如何运作?

我有一个基于C#的UI,它使用基于C ++的DLL。 我的要求是将大量内存从C#传递给DLL。 DLL将写入此内存缓冲区并将其传递回C#。 我使用IntPtr和全局内存函数来做到这一点。 一切正常。 问题是,如何validationMarshal.FreeHGlobal()是否清理了内存? 我正在使用大块内存,通常以MB为单位。 所以我想确保立即清理内存。

我class级的内存实例使用了多少 – 务实的答案

调用构造函数后跟随类的实例有多大? 我想这通常可以写成size = nx + c,其中x = 4中的x = 4,x64中x = 8。 n =? c =? 在.NET中有一些方法可以返回这个数字吗? class Node { byte[][] a; int[] b; List c; public Node() { a = new byte[3][]; b = new int[3]; c = new List(0); } }