【问题标题】:What happens when memory will be full?当内存已满时会发生什么?
【发布时间】:2015-09-14 16:15:12
【问题描述】:

我正在开发一个 C# WPF 应用程序,它使用来自许多图像的像素数据来处理一个图像。
它将每个图像存储为 System.Drawing.Bitmap 并锁定在内存中。
用户可以打开任意数量的图像。

问题是,当用户打开这么多图像时,通常会发生什么,以至于在处理过程中内存会被填满?

在我的 Windows 8.1 计算机上,发生这种情况时,我在任务管理器中看到内存使用率越来越高,速度变慢,并冻结一分钟,然后应用程序退出。

但是,在我的 Windows 8.1(非 RT)平板电脑上,当这种情况发生时,我在任务管理器中看到内存使用率越来越高,然后突然变低,然后又变高,依此类推 2-3 次。 ..(这对我来说很奇怪,因为我认为所有图像都应该保存在内存中,只有在不再需要时才从内存中释放),速度正常,没有冻结,并且发生AccessViolationException

所以我想知道这些行为是否正常,如果不是,什么是正常行为,为什么对我来说不正常?

【问题讨论】:

  • 将所有图像加载到内存中通常不好。只需加载必须向用户显示的图像。相反,您必须保存图像的路径并在需要时加载图像。

标签: c# wpf memory bitmap access-violation


【解决方案1】:

C# 对于需要大量内存的应用程序来说不是一种好的语言。所以就像一个建议,我会说:

  • 验证您是否真的需要内存中的所有图像来处理,或者您只需要 2 个或其中的一部分在内存中,同时代。

  • 如果答案是肯定的,您可以查找 MemoryMapped 文件。

  • 如果答案是否定的,请重新架构您的代码。

回答您的问题:不,这不是正常行为,处理导致某些应用程序未定义行为的内存消耗的唯一正确方法是修复应用程序的架构。

【讨论】:

  • 内存使用率越来越高,然后突然变低,然后又越来越高,依此类推,持续 2-3- 我认为是因为分页?
  • 显然可以因为GC。即使 OP 认为所有图像仍在内存中,也可能不是。这是我的猜测。
猜你喜欢
  • 2015-07-04
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
相关资源
最近更新 更多