Tag: 内存

C#:访问“.NET CLR内存类别”的PerformanceCounters

我正在尝试使用PerformanceCounter类通过C#访问位于“.NET CLR内存类别”中的性能计数器。 但是,无法使用我期望的正确类别/计数器名称来实例化类别 new PerformanceCounter(“.NET CLR Memory”, “# bytes in all heaps”, Process.GetCurrentProcess().ProcessName); 我尝试使用以下代码循环遍历类别和计数器 string[] categories = PerformanceCounterCategory.GetCategories().Select(c => c.CategoryName).OrderBy(s => s).ToArray(); string toInspect = string.Join(“,\r\n”, categories); System.Text.StringBuilder interestingToInspect = new System.Text.StringBuilder(); string[] interestingCategories = categories.Where(s => s.StartsWith(“.NET”) || s.Contains(“Memory”)).ToArray(); foreach (string interestingCategory in interestingCategories) { PerformanceCounterCategory cat = new PerformanceCounterCategory(interestingCategory); foreach (PerformanceCounter counter in […]

使用指针和偏移量查找地址C#

我做了很多关于记忆阅读的研究,我到了这里。 我得到了指针和偏移值,通过手动添加地址并在Cheat Engine上选择“Pointer”我可以得到地址。 但我的问题是如何在C#上做到这一点? 指针: “client.dll”+ 0065F38 偏移: E4 这两个值返回Cheat Engine中的地址,我想知道如何在C#中创建它。

内存消耗.Net应用程序(Azure网站)

我们使用Azure网站作为我们的平台提供商,我正在调试与托管应用程序相关的一些内存问题,我们需要一种实用的方法来了解为什么我的应用程序会消耗这么多内存。 我们有50个在线用户,但是从120个线程中消耗了1.5 GB的IIS进程。 我尝试了内存转储,但我没有得到足够的线索来解决问题。 过去我使用的是yourkit.net分析器。 发现问题非常顺利,因为我能够监视线程及其内存使用情况。 我的工作集作为私有工作集中的内存量加上进程正在使用的可由其他进程共享的内存量非常接近于private_memory。 我的私有字节是我的进程分配的内存的当前大小(以字节为单位),无法与其他进程共享。 所以看起来我正在使用所有这些内存。 但无法决定我如何使用这么多内存。 我的系统每个用户的成本超过25兆字节。 这对我的可扩展性产生了真正的担忧。 我安装了NewRelic,但没有得到那么多的帮助。

如何调试误导性的GDI OutOfMemoryexception?

我有一个调整位图大小的函数。 这是一个“面包和黄油”操作,我只是从另一个项目复制它: private Bitmap ResizeBitmap(Bitmap orig) { Bitmap resized = new Bitmap(this.Xsize, this.Ysize, PixelFormat.Format16bppGrayScale); resized.SetResolution(orig.HorizontalResolution, orig.VerticalResolution); using (Graphics g = Graphics.FromImage(resized)) { g.DrawImage(orig, 0, 0, resized.Width, resized.Height); } return resized; } 但是,我一直在Graphics g = Graphics.FromImage(resized)上获得OutOfMemoryexception。 我知道, 当谈到GDI时,OutOfMemoryexception通常会掩盖其他问题 。 我也非常清楚我想要resize的图像并不大(据我所知)GC在离开当前范围时应该没有问题收集实例。 无论如何,我现在已经玩了一段时间它现在看起来像这样: private Bitmap ResizeBitmap(Bitmap orig) { lock(orig) { using (Bitmap resized = new Bitmap(this.Xsize, this.Ysize, PixelFormat.Format16bppGrayScale)) […]

托管环境中使用的最大堆? (.NET / JAVA)

您在托管环境(如Java或.NET)中个人使用的最大堆是多少? 你遇到的一些性能问题是什么,你最终得到的回报越少,堆越大?

长时间运行的应用程序变慢

有一个由三个可执行文件组成的应用程序。 其中之一 – 调度程序,运行其他可执行文件。 调度程序在完成时从可执行文件接收代码。 也就是说,只有调度程序始终在运行,其他可执行文件会卸载并再次加载。 该应用程序在服务点运行并全天候工作。 在第一次启动时,应用程序运行得很快。 在一天结束时,应用程序运行速度非常慢。 这种行为可能是什么原因?

使用线程时内存泄漏

我似乎在这段代码中有内存泄漏。 它是一个控制台应用程序,它创建了几个类(WorkerThread),每个类都以指定的时间间隔写入控制台。 Threading.Timer用于执行此操作,因此写入控制台是在单独的线程中执行的(TimerCallback在从ThreadPool获取的单独线程中调用)。 更复杂的是,MainThread类挂钩到FileSystemWatcher的Changed事件; 当test.xml文件更改时,将重新创建WorkerThread类。 每次保存文件时(每次重新创建WorkerThread和Timer时),任务管理器中的内存都会增加(内存使用情况,有时还会增加虚拟机大小); 此外,在.Net Memory Profiler(v3.1)中,WorkerThread类的未分配实例增加了两个(这可能是一个红色的鲱鱼,因为我已经读过.Net Memory Profiler有一个错误,它很难检测到处理class级。 无论如何,这是代码 – 有谁知道什么是错的? 编辑 :我已经将类创建移出FileSystemWatcher.Changed事件处理程序,这意味着WorkerThread类总是在同一个线程中创建。 我为静态变量添加了一些保护。 我还提供了线程信息,以更清楚地显示正在发生的事情,并使用Timer与显式线程交换; 然而,记忆仍然在泄漏! Mem Usage一直缓慢增加(这只是由于控制台窗口中的额外文本?),并且当我更改文件时VM大小增加。 这是代码的最新版本: 编辑当你写入它时,这似乎主要是控制台使用内存的问题。 显式编写的Threads仍然存在增加内存使用量的问题。 请参阅下面的答案 。 class Program { private static List threads = new List(); static void Main(string[] args) { MainThread.Start(); } } public class MainThread { private static int _eventsRaised = 0; private […]

Visual Studio 2005搜索内存

我认为这不存在,但无论如何我都会把它扔出去。 调试时是否可以在内存中搜索值? 例如,如果我在内存中的某处缓存了一个字符串“uniqueString”,但我不知道它存储在哪个变量下 – 我可以搜索它吗? 在中,找出哪个变量有“uniqueString”作为它们的值? 这适用于C#托管代码。

检测即将耗尽的内存(获取“免费物理内存”的数量)

我正在将图像从高FPS相机传输到内存缓冲区(列表)中,并且由于这些图像非常大,因此计算机的内存耗尽非常快。 我想做的是在应用程序内存不足之前停止传输一段时间。 在我的测试过程中,我发现它与“Free Physical Memory”指标一致,接近于零。 现在的问题是我找不到实际以编程方式获取此值的方法; 在XP中,它甚至没有显示在任何地方(仅在Vista / 7任务管理器中)。 我已经尝试了所有可以找到的方法(WMI,性能计数器,MemoryStatus,……),但我从那些方面得到的只是“可用物理内存”,当然不一样。 有任何想法吗? 更新不幸的是,我需要数据在内存中(是的,我知道我不能保证它将在物理内存中,但仍然),因为数据是实时流式传输的,我需要在内存中预览它它被存储在那里。

我的(巨大的)应用程序抛出OutOfMemoryException,现在是什么?

这是迄今为止我构建的最复杂的软件,现在它似乎在某些时候耗尽了内存。 我还没有进行过广泛的测试,因为我有点迷失了我应该如何解决手头的问题。 HandleCount: 277 NonpagedSystemMemorySize: 48136 PagedMemorySize: 1898590208 PagedSystemMemorySize: 189036 PeakPagedMemorySize: 1938321408 VirtualMemorySize: 2016473088 PeakVirtualMemory: 2053062656 WorkingSet: 177774592 PeakWorkingSet: 883834880 PrivateMemorySize: 1898590208 PriviligedProcessorTime: 00:00:15.8593750 UserProcessorTime: 00:00:01.6562500 TotalProcessorTime: 00:00:17.5156250 GDI Objects: 30 User Objects: 27 我有一个自动化的全局exception捕获器,在exception时收集上述信息(使用System.Diagnostics.Process) – 以及exception信息,日志和屏幕截图 – 并通过电子邮件发送给我所有内容。 这已经很好地工作了,因为我已经能够根据电子邮件信息插入错误。 到目前为止,这是。 该软件有数万行,并使用托管和非托管资源。 我可以逐行开始编写代码,但有些我觉得这可能不是尝试推断内存构建问题的最佳方法。 由于我以前从未做过这种分析,你会如何建议解决这类问题?