Tag: memory management

如何调试Windows Phone上的内存不足

我在c#中制作WP8图像处理应用程序,并且遇到了一些内存问题。 如果我离开应用程序,并导航回了很多次,我的内存耗尽(例如Home – > back – > home – > back …)。 我想知道如何调试这个问题? 我正在尝试尽可能多地清理内存(使用Dispose / setting to null),但它无法正常工作。 我该如何调试? 有没有办法找出内存是如何使用的?

属性或get / set方法对对象大小的影响

就对象大小而言,如果公开的属性不表示状态而只是将其getter和setter调用委托给另一个实体,那么属性如何取代Get / Set方法会影响对象大小? 例如,请考虑以下类: public class Person { Address _address = new Address(); public string AddressName { get{ return _address.Name; } set { _address.Name = value; } } public string GetAddressName(){ return _address.Name; } public void SetAddressName(string name){ _address.Name = name; } } public Address { public string Name { get; set; } } 我猜测当创建一个新Person时,CLR在确定要分配多少内存时将考虑AddressName属性的潜在大小。 […]

动态编译代码时发生IOException

我有以下代码行: CSharpCodeProvider c = new CSharpCodeProvider(); CompilerParameters cp = new CompilerParameters(); cp.ReferencedAssemblies.Add(“system.dll”); cp.CompilerOptions = “/t:library”; cp.GenerateInMemory = true; CompilerResults cr = c.CompileAssemblyFromSource(cp, sb.ToString()); 这会导致抛出IOException 。 附加信息:进程无法访问文件’C:\ Users \ Username \ AppData \ Local \ Temp \ _dgl5fb1i.err’,因为它正由另一个进程使用。 但是,这是耗费超过8GB RAM的大型程序的一部分。 在具有16GB RAM的系统上,不会抛出此exception。 动态编译的代码编译好并运行。 程序在具有足够RAM的系统上运行时没有任何错误。 该程序是为x64编译的。 请注意,我没有收到OutOfMemoryException或任何迹象表明程序内存不足。 在任务管理器中,内存使用率几乎在抛出IOException之前到达顶部。 什么可能导致这种行为,任何人都可以提出解决方案? 编辑 我修改了应用程序以使用更少的内存。 即使应用程序有足够的可用内存,错误仍然存​​在。 问题仍然只发生在一台机器上。 这可能与以下post有关: 阻止CompileAssemblyFromSource生成具有重复文件名的临时文件 。

当需要更多空间时,列表会在c#中占用一倍的空间。 在某些时候,加倍说1024到2048会变得不那么有效吗?

当数字较小时,可以快速将数组列表的大小从2个增加到4个内存地址,但是当它开始增加空间量时,更接近数组列表中允许的最大空间量(接近2MB限制) 。 如果只是将arrays的大小增加到某个时刻所需尺寸的一小部分,那么改变这些更大区域中分配的空间会更有效吗? 显然,从1mb增加到2mb的大小现在并不是什么大不了的事情 – 但是如果你每小时有5万人每小时运行一次这样做会使arrays大小增加一倍,我很好奇这是否足够好有理由改变其运作方式。 更不用说减少不需要的内存空间(理论上)。 我的意思的小图形表示.ArrayList a中有4个元素,这是它目前的最大大小 |||| 现在让我们向arraylist添加另一个项目,内部代码将使数组的大小加倍,即使我们只向数组添加一个东西。 arraylist现在变成了8个元素 |||||||| 在这些大小级别,我怀疑它有什么不同,但是当你每次分配1mb到2mb时,有人会做一些事情,比如将一些文件添加到一个arraylist或大约1.25mb的东西,那么分配了0.75mb的不需要的空间。 为了让您更好地了解System.Collections.Generic类当前在c#中运行的代码。 它现在的工作方式是每次用户尝试向数组太小的数据添加内容时,它会使数组列表(读取数组)的大小加倍。 加倍尺寸是一个很好的解决方案并且有意义,直到你实际上增长它远远大于技术上需要它。 以下是该类特定部分的来源: private void EnsureCapacity(int min) { if (this._items.Length >= min) return; // This is what I’m refering to int num = this._items.Length == 0 ? 4 : this._items.Length * 2; if ((uint) num > 2146435071U) num = 2146435071; […]

虚拟和物理内存/ OutOfMemoryException

我正在开发一个64位的.Net Windows服务应用程序,它实际上会加载一堆数据进行处理。 在执行数据量测试时,我们能够压倒该进程并抛出OutOfMemoryException(当它失败时我没有关于进程的任何性能统计信息。)我很难相信该进程请求了一大块内存自从在64位计算机上运行以来,已超出该进程的允许地址空间。 我知道该进程正在一台机器上运行,该机器一直在80%-90%的物理内存使用率附近。 我的问题是:如果机器的可用物理内存严重不足,CLR是否会抛出OutOfMemoryException,即使进程不会超过其允许的虚拟内存量? 谢谢你的帮助!

第3代对象与大对象堆之间的区别

大对象堆和GC第3代对象有什么区别?

.Net框架中的手动内存分页(可能/如何?)

我对编写数据库管理系统很感兴趣。 阅读了几页关于如何实现SQL Server 2000的内容,我发现使用了4KB的内存页,每个页都是硬盘上4KB页面的直接副本。 这些页面根据需要加载到RAM中,然后在它们闲置时懒得写回磁盘(过度简化)。 在我的项目的规划阶段,我想知道在CLR上运行的代码中是否可以实现这种级别的控制。 我意识到C,C ++或D可能更适合这项任务,但我想首先向我自己certificate。 这背后的部分动机是我最终想用自己的数据库作为堆来覆盖CLR垃圾收集器,至少对于相对陈旧的对象。 是否可以直接从CLR控制内存? 如果是这样,我该怎么做? 现在假设我的数据是一堆256字节宽的结构/类,存储在磁盘上的平面表中,而我使用的是64KB页面。

在C#中为数组分配新结构时会发生什么?

假设我有一个C#结构: struct Foo{ int mA; public int A {get {return mA;}} int mB; public int B {get {return mB;}} public Foo(int a, int b) { mA = a; mB = b; } } 然后我创建了Foo的数组: Foo[] foos = new Foo[10]; 我这样做会发生什么? foos[1] = new Foo(20, 10); 如果Foo是一个类,Foo []会在堆上保存一个指向Foo对象的指针,并且该指针将被更改为新的Foo对象(旧的对象被留下来进行回收)。 但由于结构是值类型,新的Foo(20,10)是否会物理覆盖以前由foos [1]持有的相同内存位置?

在托管的Win8 metro应用程序中查找内存泄漏?

我目前正在使用C#和SharpDX为Windows 8开发一款地铁游戏。 该项目进展顺利,但最近需要开始追踪内存泄漏,我不确定从哪里开始。 Visual Studio 11中的内置内存分析器不适用于Metro应用程序,WinDBG似乎无法连接到metro应用程序(除非我使用不正确),而且我很难找到任何有关查看.NET 4.5 for metro中的托管分配。 有人对这个有经验么? 有一个好地方开始寻找? 有没有人成功使用工具来帮助检测Metro应用中的内存泄漏?

如何在Windows 7中模拟低内存条件

我有一个用C#编写的应用程序运行良好,但偶尔会在现场发出错误,我们认为这些错误是由于内存条件不足或与垃圾收集器的交互造成的。 如果有人有兴趣,这里描述: 无法将类型为’NHibernate.Impl.ExpandedQueryExpression’的对象强制转换为’NHibernate.Linq.NhLinqExpression’ 我想尝试重现这个以进行调试,但我的开发机器有太多的内存。 我删除了页面文件,因此我的虚拟内存仅限于12GB的物理内存,所以除了物理删除ram之外,是否有人对如何在开发环境中模拟低内存条件有任何建议? 编辑: 删除了询问监视垃圾收集器的工具?