vb.net 应用程序出现 OutOfMemoryException

2023-11-24

在我的 VB.Net 应用程序之一中,我在运行该应用程序时遇到错误。这个错误并不总是出现。所以我也无法重现该错误。也没有重现错误的确切顺序。

堆栈:System.OutOfMemoryException:内存不足。 在 System.Drawing.Graphics.FromHdcInternal(IntPtr hdc) 在 System.Windows.Forms.ToolStrip.OnPaint(PaintEventArgs e) 在System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e,Int16层,布尔disposeEventArgs) 在 System.Windows.Forms.Control.WmPaint(Message& m) 在 System.Windows.Forms.Control.WndProc(Message& m) 在 System.Windows.Forms.ScrollableControl.WndProc(Message& m) 在 System.Windows.Forms.ToolStrip.WndProc(Message& m) 在 System.Windows.Forms.StatusStrip.WndProc(Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 在System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)

错误描述:

MyApplication_UnhandledException

出现此错误后,我收到一条消息:

内存不足,无法创建位图。关闭一个或多个应用程序以增加可用。

当我检查应用程序的内存使用情况时,它并没有那么高。此错误不会重复出现。那么我该如何解决这个错误。怎么解决呢? 我使用 .Net 内存分析器和 redgate 内存分析器检查了应用程序的运行情况。

下面是非托管内存使用量的屏幕截图。我不知道这些值是否很高。

UPDATE:

我再次收到错误。检查了 gdi 对象,结果是 9998。所以错误是由于高 gdi 对象造成的。现在问题是如何解决。然后我使用GDIView并检查。通过该工具,我得到了 pen-2954 Brush-5918 font-90 bitmap-13 等 GDI Total-9998 那么这些笔和画笔是什么?在我的代码中,我没有使用画笔或笔。(我在代码中搜索了“笔”和“画笔”,但没有得到任何结果。)所以请帮助我


In your 任务管理器,转到View菜单来选择要在其中显示的列流程标签。选择您想要显示的GDI 对象柱子。我相当肯定您会看到进程的 GDI 对象总数达到 10000,这是任何进程的最大值。

这与使用了多少物理内存无关。从这个意义上说,该错误消息非常糟糕且具有误导性。问题是您已经用完了 GDI 句柄。 Windows 下的每个进程都限制其可以创建的 GDI 句柄的最大数量。当前每个进程的限制为 10000 个句柄。

我假设您的问题是 GDI 句柄的原因是因为在绘制控件的过程中尝试创建新位图时会引发异常。位图是一个 GDI 对象。创建位图会使用该位图的 GDI 句柄。因此,这很可能是原因。

由于错误发生在标准中ToolStrip控制,这不太可能是一个错误ToolStrip,本身。更有可能的是,您在程序的其他地方用完了所有 GDI 句柄,然后,当控件尝试绘制自身时,它会失败,因为没有剩余的句柄。

每当您创建 GDI 对象(例如笔和位图)时,您都需要确保释放这些对象。所有获取 GDI 句柄的 GDI 类都实现IDisposable界面。当对象被处理时,它们会自动删除此时的句柄。但是,如果您从不处理这些对象,则句柄永远不会被删除,并且您的 GDI 对象数量只会不断增长。

处置任何IDisposable对象,您可以简单地调用Dispose完成对象后的方法,例如:

Dim b As New Bitmap("test.bmp")
'...
b.Dispose()

但是,如果可以的话,最好声明变量IDisposable对象具有Using块,像这样:

Using b As New Bitmap("test.bmp")
    '...
End Using

随着Using块,Dispose方法将自动为您调用,因此您无需自己显式调用它。原因是Using阻止比调用更好Dispose你自己是因为,如果在内部抛出异常Using块,Dispose方法仍然会被自动调用。如果您自己明确调用它,而不带Using块,更容易错过您需要调用它的每个地方。

要查找代码中的问题区域,请在调试器中运行程序并单步执行代码。留下任务管理器打开,显示GDI 对象列,当您单步执行代码时。看着GDI 对象栏目中的任务管理器随着新 GDI 对象的创建,您将看到计数增加。使用这种方法应该很容易找出问题所在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vb.net 应用程序出现 OutOfMemoryException 的相关文章

  • 将 .NET P/Invoke 代码组织为 Win32 API 的最佳实践

    我正在 NET 中重构一个大型且复杂的代码库 该代码库大量使用 P Invoke to Win32 API 该项目的结构不是最好的 我发现 DllImport 语句遍布各处 经常为同一函数重复 并且还以多种方式声明 导入指令和方法有时声明为
  • Visual Studio 2022 - 编译旧应用程序时出错

    我们正在尝试在 Visual Studio 2022 中使用 VB6 32 位应用程序 编译 2002 年以来非常旧的应用程序 我们需要调试此应用程序并能够在 Windows 10 计算机上运行此应用程序 编译时 我们发现以下错误 这似乎是
  • 捕获另一个进程未处理的异常

    我想知道我是否可以捕获我开始使用 Process Start 的另一个进程抛出的未处理的异常 我知道我可以用这个捕获标准错误link http social msdn microsoft com Forums en US csharpgen
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 很好地处理数据库约束错误

    再一次 它应该很简单 我的任务是在我们的应用程序的域对象中放置一个具有唯一约束的特定字段 这本身并不是一个很大的挑战 我刚刚做了以下事情 public class Location more fields Column unique tru
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • 比较数组中的文件、从文本文件中删除行、函数、日志记录

    所以我创建了这两个数组 Approved Shares 和 Current Shares Reads Approvedshare txt and makes the txt file into an array public objFSO
  • 当 Jenkins 在 Ubuntu 上作为守护进程运行时,如何为 Jenkins 提供更多堆空间?

    我的 Jenkins 作业内存不足 给java lang OutOfMemoryError构建日志中的消息 但我使用了 Ubuntu 包管理器 aptitude or apt get安装 Jenkins 我不知道在哪里可以更改分配给 Jen
  • SELECT 语句会受到 SQL 注入攻击吗?

    实际上有2个问题 我知道我必须尽可能多地使用存储过程 但我想知道以下内容 A 我可以从 SELECT 语句 例如 Select from MyTable 获得 SQL 注入攻击吗 B 另外 当我在 ASP NET 中使用 SQLDataSo
  • 使一个对象只能被同一程序集中的另一个对象访问?

    每个业务对象都有一个包含 sql 调用的匹配对象 我想限制这些 sql 对象 使其只能由匹配的业务对象使用 如何才能实现这一目标 Update 格雷格提出了关于可测试性的观点 由于 SqlObjects 将包含非常特定于业务流程的 sql
  • UDP SocketException - 通常只允许每个套接字地址使用一次

    尽管这里有很多非常相似的问题 但提供的答案都没有帮助我 这让我很难过 我有一个非常大的管理系统 我的任务是为其编写一些 UDP 数据包发送 接收 我已经编写了一个原型 一切都很好 所以我开始将我的代码合并到所述系统中 然而 我现在弹出了一个
  • NumPy 和 memmap:[Errno 24] 打开文件太多

    我正在处理大型矩阵 因此我使用 NumPy memmap 但是 我收到错误 因为显然 memmap 使用的文件描述符没有关闭 import numpy import tempfile counter 0 while True temp fd
  • 将 SpringMVC 应用程序热部署到 Tomcat7 时出现 OutOfMemoryError - 可能与 log4j2 有关

    我在热部署 Spring MVC 4 0 不是 Spring Boot Web 应用程序时遇到问题 我正在尝试不使用 xml 只使用 Java Config 删除 web xml 时出现 OutOfMemoryErrors or 当我部署一
  • 并发访问且不受数据结构的影响

    问题是这样的 我有一个包含 500 个指针的数组 它们指向双向链表中的 500 个元素 有 10 个并行运行的线程 每个线程运行 50 个循环 并尝试释放列表中的某些元素 该列表已排序 包含简单整数 并且有 10 个其他线程并行运行 搜索包
  • VB.NET 类或模块的用途是什么?

    这里是新手酱 所以 我试图找到答案 但找不到 拥有类或模块的目的是什么 我读到的所有内容都试图告诉我它是什么 但不是它的用途 为什么我需要制作一个 我读到的所有内容似乎都对阅读教程的人做出了假设 就好像我知道很多一样 模块实际上与仅包含共享
  • 数字或货币的字符串格式?

    我需要为每个千给出逗号 所以我用了DataFormatString 0 它运行良好 但当值为0 它正在显示 00 我只想只显示 0 我们怎样才能做到这一点 DataFormatString 0 C0 这将格式化为小数点后 0 位的货币 Da
  • 如何使用 vb.net 将数据插入 Access 表?

    我想在 Access 数据库中插入一个新行 我正在考虑做类似的事情 oConnection new Connection connectionstring oTable oCennection table Orders oRow oTabl
  • .NET 内存不足故障排除

    在阅读了几篇有关 NET 技术中的内存的启发性文章后 Out of Memory 不是指物理内存 https learn microsoft com en us archive blogs ericlippert out of memory
  • 在 VB.NET 中将类标记为静态

    正如刚刚在最近的一篇文章中所说question https stackoverflow com questions 135759 why cant i inherit iodirectory and answer https stackov
  • 如何正确处置注入的DLL线程?

    我将一个 DLL 注入到目标进程中 以在玩 MMORPG 时充当助手 当前功能将按键转换为鼠标点击 因为 MMORPG 要求用户移动鼠标才能实现某些功能 这是我所鄙视的 假设我出于某种原因想要取消注入 DLL 我该怎么做呢 这个方法干净吗

随机推荐

  • 如何从 Firefox 扩展执行页面定义的 JavaScript 函数?

    我正在创建一个 Firefox 扩展用于演示目的 我从扩展调用文档中的特定 JavaScript 函数 我在 HTML 文档中写了这个 不是在扩展内 而是由 Firefox 加载的页面 document funcToBeCalled fun
  • 是否有解决未定义的引用/未解决的符号问题的通用准则?

    我在工作中遇到了几个 未定义的引用 在链接期间 和 未解析的符号 在 dlopen 之后的运行时期间 问题 这是一个相当大的 makefile 系统 是否有链接库和使用编译器标志 选项来避免这些类型的错误的通用规则和指南 如果您使用的是 M
  • iPhone项目中如何准确找到内存泄漏的地方

    在 Xcode 中开发应用程序时 会发生内存泄漏 当我在扩展详细视图中检查它们时 它们显示了与实现无关的不同方法 如何准确找出哪个对象正在泄漏以及哪里泄漏了内存 当启用 ARC 时 我们是否必须处理内存泄漏 即使ARC可能会发生内存泄漏 它
  • ProGuard 不会用依赖项混淆 JAR

    我有一个项目pom xml下面给出的文件 当我发出命令时mvn clean compile assembly single install我希望 Maven 生成一个 JAR 其中包含 所有依赖项和 我的代码的混淆版本 它不起作用 我的代码
  • 使用 PDO 和准备好的语句进行 MySQL 更新不起作用

    我在使用 php PDO 和 mysql 时遇到一个奇怪的问题 我有下表 create table test table id integer value text 单行 insert into test table values 1 as
  • 将创建的图像文件追加到 formdata 中

    我使用画布创建了图像 我想在表单数据中附加确切的图像文件而不是网址 这是我的代码
  • 在池中使用多个 Memcache 服务器

    我正在查看文档 对于指定多个服务器时 memcache 如何进行内部负载平衡有点困惑 例如 import memcache mc set servers 127 0 0 1 11211 127 0 0 1 11212 mc set some
  • 如何开始使用 Solr.NET

    嘿 我想知道如何开始使用 Solr NET 甚至是基础知识 要下载哪些文件等 我当然检查了网络 但就像每个网站都说不同的东西 有些网站比较旧 所以不确定 Cheers 看看这些问题 Solr 可用于 Net 吗 如何安装SOLRNET Se
  • Joda-Time 基于区域设置的日期时间格式

    我从另一个系统收到一个字符串日期 并且我知道该日期的区域设置 也可以从其他系统获得 我想把这个字符串转换成乔达时间 DateTime对象而不明确指定目标模式 例如 我想仅使用区域设置将此字符串 09 29 2014 转换为日期对象 而不是通
  • numpy 数组在 pyglet 中显示不正确

    我在使用 pyglet 显示 numpy 数组时遇到问题 我发现了一个非常相似的主题 如何使用 pyglet 显示 numpy 数组 我用过的 我想以灰度显示数组 但 pyglet 用颜色显示它 请参见图像 https i stack im
  • pycharm 不会对未使用的变量和导入发出警告

    突然我的 pycharm 停止警告未使用的变量或未使用的导入 将这些行着色为灰色 我在设置和检查中到处寻找 找不到问题所在 您可以通过以下方式再次启用它Settings gt Editor gt Inspections and in Pyt
  • cattr_accessor 位于 Rails 之外

    我正在尝试使用谷歌搜索ruby 库 代码如下 但它抱怨 cattr accessor是一个未定义的方法 有什么想法可能是这样或者我如何解决它 require rubygems require google search GoogleSear
  • SQL“LIKE”语法

    我正在编写一个需要在 mysql 和 postgresql 上运行的应用程序 我必须使用like比较一些值 在mysql中LIKE它不区分大小写 在 PostgreSQL 中LIKE它区分大小写并且ILIKE它不区分大小写 如果匹配必须不区
  • HTML 视频自动播放而不静音(或者 youtube 是如何做到的)?

    我知道许多较新的浏览器现在禁用autoplay当视频不存在时muted或将其静音然后播放 如果没有用户交互 也无法调用视频播放 这是可以理解的 但我想知道 youtube 如何仍然能够用声音开始视频 我查了一下 他们确实使用了视频标签 只是
  • Laravel redirect::route 在页面加载之间显示一条消息

    我目前正在使用 Laravel 开发一个网络应用程序 直到最近该应用程序都运行得很好 我不知道是什么触发了它 但这是我遇到的问题的摘要 登录过去可以正常工作 因为我有一个 AccountController 可以执行以下操作 auth Au
  • 实现安全 nullptr

    我想让我的代码在旧版 C 使用 NULL 的 C 代码 和新的 C 11 标准 使用 nullptr 的 C 代码 上都可编译 我正在使用 GCC 但计划在完成最重要的事情时也为 VS 重新编译整个代码库 我是否应该期望 GCC 和 VS
  • 为什么 Files.lines (和类似的 Streams)不会自动关闭?

    Stream 的 javadoc 指出 流有一个 BaseStream close 方法并实现 AutoCloseable 但几乎所有流实例在使用后实际上并不需要关闭 通常 只有源是 IO 通道的流 例如由 Files lines Path
  • 通过多个索引引用 PHP 数组

    这可能是某种奇怪的较长捷径 如果我的思路有误 请纠正我 我有一个数据矩阵 如下所示 unique id url other random data unique id url other random data unique id url
  • 查找数据框中每行的前 N ​​列

    给定一个包含一个描述性列和 X 个数字列的数据框 对于每一行 我想识别具有较高值的 前 N 列 并将其保存为新数据框上的行 例如 考虑以下数据框 df pd DataFrame df index A B C D E F df option1
  • vb.net 应用程序出现 OutOfMemoryException

    在我的 VB Net 应用程序之一中 我在运行该应用程序时遇到错误 这个错误并不总是出现 所以我也无法重现该错误 也没有重现错误的确切顺序 堆栈 System OutOfMemoryException 内存不足 在 System Drawi