【问题标题】:How to fix this "OutOfMemoryException", why do I get it since I use only 4/16 GB?如何修复此“OutOfMemoryException”,为什么我只使用 4/16 GB 会得到它?
【发布时间】:2019-07-13 19:57:18
【问题描述】:

目前我确实在 8 周的课程中学习 C#。我有一个小程序,它只会给我一个 OutOfMemoryException。

但是我真的不知道为什么会调用这个异常。我的意思是 Windows 任务管理器显示我只使用了 4 个 16 GB RAM。即使我在重新启动计算机后尝试测试这个程序。

我有一个表格应该用于工作......但我没有看到错误。

接下来您将看到此应用程序中唯一 Button 的代码。

private void cmdAuswahl_Click(object sender, EventArgs e)
{
  Graphics z = CreateGraphics();
  Font df = new Font("Verdana", 11);
  SolidBrush pinsel = new SolidBrush(Color.Black);

  OpenFileDialog ofd = new OpenFileDialog();
  Image bild;

  z.Clear(BackColor);

  ofd.InitialDirectory = "C:\\Temp";
  ofd.Title = "Bitte eine Bilddatei wählen";
  ofd.Filter = "Bild-Dateien (*.jpg; *.gif)|*.jpg; *.gif";

  if (ofd.ShowDialog() == DialogResult.OK)
  {
     bild = Image.FromFile(ofd.FileName);
     z.DrawImage(bild, 20, 40);
     z.DrawString("Breite: " + bild.Width + ", Höhe: " +
     bild.Height, df, pinsel, 20, 20);
  }
  else
     MessageBox.Show("Keine Bilddatei ausgewählt");
}

我使用“crtl + f5”启动应用程序并单击按钮。 在此之后,我选择了一个 122 KB 的 image.jpg。

在这之后我得到了 OutOfMemoryException

信息 über das Aufrufen von JIT-Debuggen anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung。

************** Ausnahmetext **************
System.OutOfMemoryException: Nicht genügend Arbeitsspeicher.
   bei System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
   bei System.Drawing.Image.FromFile(String filename)
   bei ZeichnenBild.Form1.cmdAuswahl_Click(Object sender, EventArgs e) in D:\CSharp\Kurs\W6T1 - 7-01\Zeichnen\10.4.1_ZeichnenBild\ZeichnenBild\Form1.cs:Zeile 31.
   bei System.Windows.Forms.Control.OnClick(EventArgs e)
   bei System.Windows.Forms.Button.OnClick(EventArgs e)
   bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   bei System.Windows.Forms.Control.WndProc(Message& m)
   bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
   bei System.Windows.Forms.Button.WndProc(Message& m)
   bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Geladene Assemblys **************
mscorlib
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll.
----------------------------------------
ZeichnenBild
    Assembly-Version: 1.0.0.0.
    Win32-Version: 1.0.0.0.
    CodeBase: file:///D:/CSharp/Kurs/W6T1%20-%207-01/Zeichnen/10.4.1_ZeichnenBild/ZeichnenBild/bin/Debug/ZeichnenBild.exe.
----------------------------------------
System.Windows.Forms
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.
----------------------------------------
System
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll.
----------------------------------------
System.Drawing
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.
----------------------------------------
System.Configuration
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll.
----------------------------------------
System.Core
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll.
----------------------------------------
System.Xml
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll.
----------------------------------------
System.Drawing.resources
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing.resources/v4.0_4.0.0.0_de_b03f5f7f11d50a3a/System.Drawing.resources.dll.
----------------------------------------
System.Windows.Forms.resources
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_de_b77a5c561934e089/System.Windows.Forms.resources.dll.
----------------------------------------
mscorlib.resources
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_de_b77a5c561934e089/mscorlib.resources.dll.
----------------------------------------

************** JIT-Debuggen **************
Um das JIT-Debuggen (Just-In-Time) zu aktivieren, muss in der
Konfigurationsdatei der Anwendung oder des Computers
(machine.config) der jitDebugging-Wert im Abschnitt system.windows.forms festgelegt werden.
Die Anwendung muss mit aktiviertem Debuggen kompiliert werden.

Zum Beispiel:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

Wenn das JIT-Debuggen aktiviert ist, werden alle nicht behandelten
Ausnahmen an den JIT-Debugger gesendet, der auf dem
Computer registriert ist, und nicht in diesem Dialogfeld behandelt.

Picture of the Task Manager, open Application and the Error

【问题讨论】:

  • 好吧......我不知道为什么,但 JPEG 中的一些图像确实有效,而另一些则无效。怎么回事?那项工作我可以在 Windows 资源管理器中看到一个小图像。但这不会显示这个原像。
  • 这是您自己整理的吗?它包含很多错误,我想没有简单的补救措施。第一步:所有未管理的东西都必须在完成后处理掉。位图/图像因 thar 而臭名昭著。因此,如果您只想绘制图像bild 一次,请丢弃它!点击事件完成后,该变量将超出范围,但不会释放 GSI+ 资源!最好将整个代码放在 using 子句中..:
  • ..using Bitmap bild = Image.FromFile(ofd.FileName)) { z.DrawImage(bild, 20, 40); z.DrawString("Breite: " + bild.Width + ", Höhe: " + bild.Height, df, pinsel, 20, 20);}
  • ..但除非图片很大,否则仅单击几次不会导致 oom 异常。但过一段时间就会了。其他应该处理的项目是字体、钢笔、画笔,然后是一些......这会立即发生吗?图片有多大(以像素为单位)?
  • 既然我提到了“很多”错误,这里是下一个:如果你能看到图像并最小化/最大化表格,它就会消失。永远不要使用control.CreateGraphics!永远不要尝试缓存 Graphics 对象!使用Graphics g = Graphics.FromImage(bmp) 或在控件的Paint 事件中使用e.Graphics 参数绘制到Bitmap bmp

标签: c# graphics out-of-memory


【解决方案1】:

看起来您正在编译为 x86,x86 进程的内存不能超过 2GB。编译为 x64。此外,对于单个图像,这会占用太多内存,会发生一些不寻常的事情

【讨论】:

  • 感谢您的帮助,我需要进行更改吗?
  • 项目属性 -> 构建 -> 目标平台 = x64
  • 谢谢...它有任何 cpu 作为目标,但复选框 qas 检查为更喜欢 32 位。目前我认为图像有问题。使用新图像,代码可以工作。
  • @ChiruKaio 我的经验是,Windows 内存管理器将不允许单个块大于~1.25GByte,即使你有 2GB 的可用内存......对于 64 位操作系统上的 32 位应用程序(在 WOW64 中运行)。可悲的是,win32 在内存管理的某个地方使用了带符号的 32 位整数,因此只有 2GByte 可用,而不是 4GByte...
猜你喜欢
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 2018-07-15
  • 2022-01-09
  • 2016-07-12
  • 2019-10-07
相关资源
最近更新 更多