Tag: 内存

在xaml窗口上调用ShowDialog时,如何防止调用垃圾收集?

我有一个使用大量内存的应用程序,但是现在我无法改变这个事实。 我的问题是我有一个我想要执行的操作并提供一个进度对话框但是看起来显示xaml进度窗口会导致GC.Collect被调用10次! 任何想法如何优化打开我的进度窗口? 根据我的Ants Profiler,GC.Collect的调用是 System.Window.ShowDialog() -> .. .. System.Windows.Media.Imaging.BitmapSource.CreateCachedBitmap -> SafeMILHandle.UpdateEstimatedSize -> SafeMILHandleMemoryPressure.ctor -> MemoryPressure.Add -> MemoryPressure.ProcessAdd -> GC.Collect

Bitmap.LockBits是否将位图“固定”到内存中?

我最近使用锁定的位图,并且一直“试图访问无效内存”错误。 这主要是因为位图已在内存中移动。 有些人使用GCHandle.Alloc()在CLR中分配内存并固定它。 Bitmap.LockBits()也这样做吗? 我不明白“锁定”内存和“固定”内存之间的区别。 你能解释术语和差异吗?

Process.GetProcessesByName(String,String)内存泄漏

我有一段代码,使用静态方法Process.GetProcessesByName(String,String)获取远程计算机上的进程列表,这可以在很多计算机上运行(几千个),我注意到它的原因是主要的内存泄漏。 我运行了ANTS内存分析器,它告诉我,我的大部分内存都是字符串,字符串包含诸如“%Idle Time”,“Processor Information”和“Cache Faults / sec”之类的存储值。 我已经认识到这些字符串可能是程序中性能计数器的一部分,问题是我在程序中没有任何性能计数器。 深入挖掘发现这些字符串保存在由PerformanceCounterLib保存的哈希表中,这些哈希表由另一个哈希表保存,该哈希表存储在PerformanceCounterLib类的内部静态成员(本身就是内部)中。 深入挖掘兔子洞,我发现Process.GetProcesesByName使用PerformanceCounterLib来获取在远程计算机上运行的进程列表,并且对于每个远程计算机,在PerformanceCounterLib的静态内部变量中创建并引用另一个PerformanceCounterLib实例。 这些实例中的每一个都认为我发现的字符串哈希表会堵塞我的记忆(每个字符串都在300-700 kb之间,这意味着它会堵塞我的大对象堆)。 我没有找到删除那些未使用的PerformanceCounterLib实例的方法,它们都是内部的,用户无法访问它们。 我该如何解决我的记忆问题? 这真的很糟糕,我的程序在24小时内达到5GB(我的服务器限制)。 编辑 :添加了一段应该重现问题的代码(未经测试)。 为了澄清: /// computerNames is a list of computers that you have access to public List GetProcessesOnAllComputers(List computerNames) { var result = new List(); foreach(string compName in computernames) { Process[] processes = Process.GetProcesses(compName); // Happens with every method that […]

C#:对象的内存使用情况

有没有办法找到特定对象使用了多少内存? 例如一个List。 考虑到所有因素,例如字符串实习以及编译器/运行时环境/无论做什么。

创建大量对象时内存不足C#

我正在处理我的应用程序中的100万条记录,这是从MySQL数据库中检索的。 为此,我使用Linq获取记录并使用.Skip()和.Take()一次处理250条记录。 对于每个检索到的记录,我需要创建0到4个项目,然后将其添加到数据库中。 因此,必须创建的平均项目总数约为200万。 IQueryable objectCollection = dataContext.Repository(); int amountToSkip = 0; IList objects = objectCollection.Skip(amountToSkip).Take(250).ToList(); while (objects.Count != 0) { using (dataContext = new LinqToSqlContext(new DataContext())) { foreach (Object objectRecord in objects) { // Create 0 – 4 Random Items for (int i = 0; i < Random.Next(0, 4); i++) { Item item = […]

.NET中的内存管理

有没有人在c#中有关于内存管理的指南,书籍或文章? 我想改进我的内存管理信息?

绑定到列表会导致内存泄漏

当我将ListBox的ItemsSource绑定到List时,绑定引擎在控件消失后保持列表元素。 这会导致所有列表元素保留在内存中。 使用ObservalbleCollection时问题就消失了。 为什么会这样? 窗口标记内的xaml GC 代码背后: public MainWindow() { InitializeComponent(); DataContext = new ViewModel(); } private void Button_Click(object sender, RoutedEventArgs e) { this.DataContext = null; ContentControl.Content = null; GC.Collect(); GC.WaitForPendingFinalizers(); } 视图模型 class ViewModel : INotifyPropertyChanged { //Implementation of INotifyPropertyChanged … //Introducing ObservableCollection as type resolves the problem private IEnumerable _list = new List […]

如何确定.NET中复杂对象的大小?

有没有办法确定.NET中复杂对象的总大小? 此对象由其他对象组成,可能包含对其他复杂对象的引用。 此对象封装的某些对象可能是POD,其他对象可能不是。

创建位图时C#内存不足

我正在创建一个应用程序(Windows窗体),允许用户根据他们选择的位置截取屏幕截图(拖动到选择区域)。 我想添加一个放大的“预览窗格”,以便用户可以更精确地选择他们想要的区域(更大的像素)。 在mousemove事件中,我有以下代码…… private void falseDesktop_MouseMove(object sender, MouseEventArgs e) { zoomBox.Image = showZoomBox(e.Location); zoomBox.Invalidate(); bmpCrop.Dispose(); } private Image showZoomBox(Point curLocation) { Point start = new Point(curLocation.X – 50, curLocation.Y – 50); Size size = new Size(100, 90); Rectangle rect = new Rectangle(start, size); Image selection = cropImage(falseDesktop.Image, rect); return selection; } private static Bitmap bmpCrop; […]

.NET安全内存结构

我知道.NET库提供了一种以受保护/安全的方式存储字符串的方法= SecureString。 我的问题是,如果我想存储一个字节数组,最好的,最安全的容器是什么?