Tag: 内存

初始化集合时,hashset对内存有什么作用?

我偶然发现了以下问题。 我想要一个所有数字从1到100.000.000的哈希集。 我尝试了以下代码: var mySet = new HashSet(); for (var k = 1; k <= 100000000; k++) mySet.Add(k); 那个代码没有成功,因为我在49mil附近的内存溢出。 这也很慢,内存增长过度。 然后我尝试了这个。 var mySet = Enumerable.Range(1, 100000000).ToHashSet(); 其中ToHashSet()是以下代码: public static HashSet ToHashSet(this IEnumerable source) { return new HashSet(source); } 我再次获得了内存溢出,但是我能够使用之前的代码输入更多数字。 有效的方法如下: var tempList = new List(); for (var k = 1; k <= 100000000; k++) tempList.Add(k); […]

从内存中删除项目/页面/用户控件

我做了一个Windows手机应用程序,不幸的是有一些内存泄漏,因为页面没有正确删除。 通过使用答案解决了这个问题: 删除页面Windows手机说明: protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { while (App.RootFrame.RemoveBackEntry() != null) ; //line if you navigate without backkey base.OnNavigatedTo(e); this.Dispatcher.BeginInvoke(() => { GC.Collect(); GC.WaitForPendingFinalizers(); this.Dispatcher.BeginInvoke(() => { GC.Collect(); GC.WaitForPendingFinalizers(); this.Dispatcher.BeginInvoke(() => { GC.Collect(); GC.WaitForPendingFinalizers(); }); }); } 这从分析器中删除了页面引用。 但是在导航时记忆仍然增加了一些。 并且增加记忆的来源并不明显。 因此,我尝试引入一个空白项目并导航到星空导航,如下所示: 这样可以移除超过20 mb的视觉效果和其他元素。 所以这是重要的一步。 因此,我希望将function分解到不同的项目中,以消除不同function之间的任何联系,并保持较低的内存使用率。 最终得到以下结构: 网络服务 MainProject SecondaryProject PortableLibrary 我使用Portable Library在所有项目之间共享模型。 这影响了每次导航到新项目时,旧项目中的所有内容都被清除,即每个项目只有一个元素存在,主要内存改进。 […]

MemoryStream有一个线程写入它和另一个读取

这是我写入流然后使用1个线程从它读取的方式: System.IO.MemoryStream ms = new System.IO.MemoryStream(); // write to it ms.Write(new byte[] { 1, 2, 3, 4, 5, 6, 7 }, 0, 7); // go to the begining ms.Seek(0, System.IO.SeekOrigin.Begin); // now read from it byte[] myBuffer = new byte[7]; ms.Read(myBuffer, 0, 7); 现在我想知道是否可以从一个线程写入内存流并从单独的线程中读取该流。

耗尽ValueType堆栈空间

我的理解是.Net中的每个新线程分配1MB的堆栈空间 。 进一步我的理解是值类型存储在堆栈而不是堆… 所以我的问题是这个; 这种行为是否意味着任何ValueType变量声明限制为1MB的存储空间? 你在当前范围内声明的ValueTypes越多,callstack就越有效,并且在某些时候这意味着声明(为了参数)〜260,000 int会使用你所有的堆栈空间?

这是否意味着如果不实现IDisposable,则不需要手动清除对象?

我面临的问题是以下错误: System.ComponentModel.Win32Exception(0x80004005):操作成功完成 堆栈跟踪: at MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d) at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks) at MS.Win32.MessageOnlyHwndWrapper..ctor() at System.Windows.Threading.Dispatcher..ctor() at System.Windows.Threading.Dispatcher.get_CurrentDispatcher() at System.Windows.Threading.DispatcherObject..ctor() at System.Windows.Media.Imaging.BitmapDecoder..ctor(SafeMILHandle decoderHandle, BitmapDecoder decoder, Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, Boolean insertInDecoderCache, Boolean isOriginalWritable, Stream […]

在单个app实例中加载大量位图时WPF内存不足exception。 有限制吗?

我需要将大量的位图加载到内存中以便在WPF应用程序中显示(使用.net 4.0)。 我遇到麻烦的地方是当我接近大约1,400MB的内存时(我从任务管理器的进程列表中得到这个)。 无论应用程序是在具有4GB内存还是6GB的计算机上运行(以及其他一些我没有详细信息的配置),都会发生同样的事情。 通过减少加载的图像和在1台机器上工作时很容易进行测试,然后它可以对它们进行全部工作,但是当它在一台机器上崩溃时它也可以在所有机器上运行。 当我减少图像数量并允许应用程序加载而不会导致内存exception时,我可以运行应用程序的多个实例(超过单个实例的1.4GB)而没有问题所以它似乎是每个实例限制或每个实例我的错误。 我将图像加载为BitmapImage,它们或者存储在List或者加载到List中,稍后在一堆分层序列中使用它们(使用Writeablebitmap ) 当我在使用中加载图像时发生错误。 在可重复的情况下,我加载了600个640X640图像以及另外200-300个较小的图像,范围从100X100到200X200,尽管它似乎是一个整体位计数问题。 所以我的问题是: *在这种情况下,是否有一些内置的进程内存限制? *是否有更好的技术将大量图像数据加载到内存中? 谢谢,Brian

是否可以在不使用分析器的情况下跟踪C#应用程序中的内存使用情况?

我想编写一个简单的应用程序来跟踪它当前的内存使用情况,创建的对象的数量等。在C ++中,我通常会覆盖new运算符,但由于显而易见的原因,我无法在C#中执行此操作。 没有使用探查器,有没有办法做到这一点?

以编程方式查找对象使用的内存

有没有办法以编程方式准确地确定c#中对象使用的内存量? 我不关心这个过程有多慢,所以左右运行GC是可以接受的(当然我更喜欢更高效的东西)。 序列化对象并查看结果长度似乎不太准确(在这个方法的简单测试中,我看到一个整数返回值为54)。 使用GC.GetTotalMemory(true)似乎会产生不一致的值,更不用说它们看起来太大了。 使用Marshal.SizeOf(object)生成准确的结果,但只能使用基元。 如果这些行中没有任何内容可用,则可以选择根据所使用的结构和所涉及的原语来计算大小。 这也是可以接受的(尽管令人不安),但我需要知道计算对象开销等的正确方法。任何能够向我展示这种方法的文献都会很棒。 类似的SO问题(其中没有一个似乎具有准确计算对象大小的具体方法): C#/ .NET对象使用多少内存? 如何在C#中获取或使用内存 如何在内存中获取对象大小? sizeof()等效于引用类型? 配置内存的工具(非程序化方法): http://www.microsoft.com/en-us/download/details.aspx?id=16273 找出C#中对象使用了多少内存?

可变结构与类?

我不确定是使用可变结构还是可变类。 我的程序存储了一个包含大量对象的数组。 我注意到使用类会使所需的内存量翻倍。 但是,我希望对象是可变的,并且我被告知使用可变结构是邪恶的。 这就是我的类型: struct /* or class */ Block { public byte ID; public bool HasMetaData; // not sure whether HasMetaData == false or // MetaData == null is faster, might remove this public BlockMetaData MetaData; // BlockMetaData is always a class reference } 像这样分配大量的对象(注意下面的两个代码都运行了81次): // struct Block[,,] blocks = new Block[16, 256, […]

监控应用程序内存使用情况的正确方法是什么?

出于调试目的,我编写了这个小静态方法: public static long CheckMemory(long maxMemorySizeBytes) { GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); var usedMemoryBytes = Process.GetCurrentProcess().VirtualMemorySize64; if (usedMemoryBytes > maxMemorySizeBytes) Debugger.Break(); return usedMemoryBytes; } 出于某种原因, VirtualMemorySize64不断返回比Visual Studio Diagnostic Tools窗口显示的内存更多的内存,以及任务管理器显示的内容。 对于我现在正在运行的具体示例,以下是数字: 诊断工具:~250 MB 任务管理器:~120 MB VirtualMemorySize64:~1100 MB 为什么会出现如此大的差异,如何从应用程序本身内正确跟踪内存使用情况?