Tag: memory

如何检查exe是否设置为LARGEADDRESSAWARE

我正在开发一个C#程序,它将加载文件并获取诸如加载文件创建日期,修改日期,大小等信息。我需要知道的另一件事是加载的文件( executable.exe )是否与LARGEADDRESSAWARE标志链接。 FileInfo类不提供此信息。 有谁知道如何在C#中找出给定的executable.exe是否与LARGEADDRESSAWARE标志链接(处理大于2 GB的地址)?

UWP Windows 10应用程序内存在导航上增加

我有一个UWP Windows 10应用程序,并注意到任务管理器中的内存使用量随着时间的推移而增加。 我将应用程序剥离,发现导航页面时内存正在增加。 所以我制作了一个只有几页的简单应用程序来测试,在这个简单的应用程序中内存仍在增加。 我有一个MainPage,可以将一个帧从Page1导航到Page2,然后返回一个计时器。 public sealed partial class MainPage : Page { private DispatcherTimer _timer; private bool _page1Showing; private bool _timerRunning; public MainPage() { this.InitializeComponent(); _timer = new DispatcherTimer(); _timer.Interval = new TimeSpan(0, 0, 0, 0, 200); _timer.Tick += _timer_Tick; } private void _timer_Tick(object sender, object e) { GC.Collect(); this.rootFrame.BackStack.Clear(); this.rootFrame.ForwardStack.Clear(); if (_page1Showing) […]

RegEx,StringBuilder和大对象堆碎片

如何在不引起LOH碎片的情况下在大字符串中运行大量RegExes(以查找匹配项)? 它是.NET Framework 4.0所以我使用StringBuilder所以它不在LOH中,但是一旦我需要在它上面运行RegEx,我必须调用StringBuilder.ToString() ,这意味着它将在LOH中。 有没有解决这个问题的方法? 拥有一个长期运行的应用程序几乎不可能处理大字符串和像这样的RegExes。 解决这个问题的想法: 在考虑这个问题时,我想我发现了一个肮脏的解决方案。 在给定的时间我只有5个字符串,这5个字符串(大于85KB)将传递给RegEx.Match 。 由于碎片发生是因为新对象不适合LOH中的空白空间,这应该可以解决问题: PadRight所有字符串最多。 接受大小,比方说1024KB(我可能需要用StringBuider来做这个) 通过这样做,所有新字符串将适合已经清空的内存,因为先前的字符串已经超出范围 不会有任何碎片,因为对象大小总是相同的,因此我只会在给定时间分配1024 * 5,并且LOH中的这些空间将在这些字符串之间共享。 我想这个设计的最大问题是如果其他大对象在LOH中分配这个位置会导致应用程序分配大量1024 KB字符串,甚至更糟糕的碎片。 但是,如果没有实际创建一个不在固定内存地址中的新字符串,我怎样才能将固定字符串发送到RegEx? 关于这个理论的任何想法? (不幸的是我无法轻易地重现问题,我通常会尝试使用内存分析器来观察更改,并且不确定我可以为此编写哪种隔离测试用例)

内存不足错误归档日志文件

我遇到了运行控制台作业的问题,并创建了我在午夜归档的每日日志文件。 这将为第二天创建一个空白日志文件,并在名称和旧文件的内容中创建一个带有昨天日期的归档文件,用于调试我可能已经知道的问题,直到第二天才知道。 但是,当我尝试归档文件时,由于我加快了BOT的工作,我遇到了System Out of Memory错误的问题。 起初我根本无法获得一个存档文件然后我找到了一种方法来获得至少最后的100,000行,这还不够。 我把所有东西都包裹在3次尝试/捕获中 I / O 系统内存不足 标准例外 但是,我总是得到OutOfMemoryException,例如 System.OutOfMemoryException错误:抛出了类型’System.OutOfMemoryException’的exception。 举个例子,大小为100,000行的日志大约是11MB文件 标准的完整日志文件可以是1/2 GB到2 GB的任何内容 我需要知道的是: a)当尝试使用File.ReadAllText或我调用ReadFileString的自定义StreamReader函数时,标准文本文件的大小会引发内存不足错误,例如 public static string ReadFileString(string path) { // Use StreamReader to consume the entire text file. using (StreamReader reader = new StreamReader(path)) { return reader.ReadToEnd(); } } b)是我的计算机内存(我有16GB内存 – 复制时使用8GB)或我在C#中使用的文件打开和复制失败的对象。 归档时我首先尝试使用我的自定义ReadFileString函数(见上文),如果返回0字节的内容我尝试File.ReadAllText然后如果失败我尝试自定义函数来获取最后100,000行,这实际上是不够的在当天早些时候调试错误。 日志文件在午夜开始创建新日志并记录全天。 我从来没有过去的内存错误,但由于我已经调高了方法调用的频率,日志记录已经扩展,这意味着文件大小也有。 这是我获取最后100,000行的自定义函数。 我想知道在没有IT丢失内存错误的情况下我可以获得多少行,并且我根本没有得到最后几天日志文件的任何内容。 […]

空白WinForms应用程序中的内存消耗过多

为什么我的Windows窗体应用程序在它是一个空白的应用程序时消耗的内存越来越多,甚至没有被用户(我)使用? 您可以使用以下步骤重现: 打开Visual Studio 2013 Ultimate New Project > C# > Windows Forms Application > .NET Framework 4.5 从“ Toolbox窗格向Form1添加PictureBox 右键单击PictureBox然后选择Choose Image… 选择 GIF文件 点击F5 打开Task Manager ,观察内存每秒增加N KB。 由于显而易见的原因,这让我感到疯狂。 我的应用程序从大约<1MB开始,在几分钟内,它达到了大约10MB。 再给它几分钟,它再次达到~40MB。 它并不止于此。 事实上,我让它跑了一夜,当我醒来时,电脑没有响应。

C#WebClient内存使用情况

我正在使用WebClient,DownloadString(“ http://example.com/string.txt ”); 当我调用它时,内存会跳起来,但永远不会再下降,因为我需要从网上下载2-3个不同的字符串,所以内存会大大增加。 我是C#的新手并且还在学习,但是从网上下载字符串之后是否还要清除内存? 如果没有,你知道我可以使用任何其他方法从网上阅读使用更少的内存吗? 谢谢

“using”关键字用于分配新的C ++ / CLI类

我有一个’C ++ / CLI’程序集,它实现了某些类。 我们假设该类是’SomeType’。 现在,在’C#’开发的应用程序中,执行以下操作 – while(!Console.KeyAvailable) { using(SomeType type = new SomeType()) { type.doSomething(); //do something } } 它会有任何后果,如内存泄漏等在任何情况下,如果有未处理的exception或任何此类情况? 我读到using关键字通常应该用于实现IDisposable的类,但对于C ++ / CLI类?

异步递归。 我的记忆在哪里?

这更多地是出于好奇而不是任何现实世界的问题。 请考虑以下代码: void Main() { FAsync().Wait(); } async Task FAsync() { await Task.Yield(); await FAsync(); } 在同步世界中,这最终会导致堆栈溢出。 在异步世界中,这只会消耗大量内存(我认为这与我可能松散地称之为“异步堆栈”的内容有关?) 这些数据到底是什么,以及如何保存?

如何获取进程使用的所有内存地址空间?

我需要知道进程使用的所有内存地址空间。 稍后将扫描存储空间以定位过程中的值并识别它们的位置/地址。 我目前的过程是通过其(基址+内存大小)获取每个模块的基址。 我正在一个已知地址已知值的进程上测试它。 当我查找该特定地址时,我得到了我期望的值。 但是,当我扫描(我相信是)进程使用的所有地址空间时,我无法在任何地方找到该值。 我知道在0x0CF8DC38和0x0CF8DDDC处存在数值“4143000”。 当我调用ReadMemoryBytes(module,module.BaseAddress,4,(IntPtr)(0x0CF8DC38))时,我返回字节( 152,55,63,0 )。 当我调用BitConverter.GetBytes(4143000)时,我得到了相同的字节集。 当我在该进程上使用不同的内存扫描程序时,我会在这些地址处找到该值。 但是,当我扫描“已知地址”时,我在任何地方都找不到这个值。 看起来我的代码甚至找不到进程使用的那些地址。 因此,我的问题是双重的: 如何在此过程中找到这些地址? 我担心我可能正在处理系统内存中的绝对地址与进程中的相对地址。 我这样做了吗? 。 // (in the calling method) foreach (ProcessModule module in process.Modules) { ParameterizedThreadStart pst = new ParameterizedThreadStart(p => SearchModule(module, value)); Thread t = new Thread(pst); t.Start(); } private unsafe void SearchModule(ProcessModule module, string value) { Process process […]

为什么.NET会创建新的子字符串而不是指向现有的字符串?

从使用Reflector的简短外观看,它看起来像String.Substring()为每个子字符串分配内存。 我是否纠正这种情况? 我认为没有必要,因为字符串是不可变的。 我的基本目标是创建一个IEnumerable Split(this String, Char)扩展方法,该方法不分配额外的内存。