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 的相关文章

  • 使用 CoCreateInstance 从 C++ 调用 COMVisible VB.Net dll

    自从我上一个问题以来 在某种程度上取得了进展 我已经编译了以下项目 它是基于https stackoverflow com a 10949784 846550 https stackoverflow com a 10949784 84655
  • C++/Windows:如何报告内存不足异常(bad_alloc)?

    我目前正在为 Windows MSVC 9 0 应用程序开发基于异常的错误报告系统 即异常结构和类型 继承 调用堆栈 错误报告和日志记录等 我现在的问题是 如何正确报告和记录内存不足错误 当发生此错误时 例如作为bad alloc抛出的ne
  • 打印“X”个字符数与“X”字符串长度的所有可能组合(暴力破解)

    我正在尝试编写一个单词组合生成器 我的意思是打印 X 个字符数与 X 字符串长度的所有可能组合 首先 我需要说的是 我在 StackOverFlow 中看到了一个关于这个问题的问题 其中有很多单词生成器的答案来执行此操作 在不同的语言上 但
  • 如何隐藏数据列表中的项目

    我想隐藏一个项目datalist根据某种条件起诉ItemBound how Wrap a PlaceHolder控制整个内容ItemTemplate 然后在 ItemDataBound 事件中 您可以执行以下操作 Protected Sub
  • 在 Unix 上,我应该对 errno 使用 system_category 还是 generic_category ?

    C 0x 有两个预定义的error category对象 generic category and system category 据我目前所知 system category 应用于操作系统返回的错误 并且generic category
  • 装配和产品版本不匹配

    我正在尝试在 asp net 网站中使用 Ajax 控件工具包 我从之前的一个示例项目中复制了 dll 它有以下详细信息 Assembly Version 3 5 40412 0 File Version 3 5 40412 2 Inter
  • 使用 Rijndael 解密文本文件

    我用过本指南 https www codeproject com Articles 12092 Encrypt Decrypt Files in VB NET Using Rijndael加密的值txtCode Text到一个文本文件中 然
  • 有没有办法使值只能由嵌套类 VB.NET 的父级访问?

    总的来说 根据OOP范式 我对封装的理解基本上是这样的 如果成员是私有的 则只能由类访问 如果成员受保护 则只能由基类和任何派生类访问它 如果成员是公开的 则任何人都可以访问 如果我有一个嵌套类 我可以声明一个属性只能由该类及其嵌套的父类访
  • 更新面板异常处理

    当我在正在构建的 ASP NET Web 应用程序中实现的 UpdatePanel 中发生异常时 它们会导致页面上出现 JavaScript 错误 并在警报中提供一些高级错误输出 这对于开发来说还可以 但是一旦系统投入生产 由于多种原因 这
  • 从 RichTextBox 复制文本及其格式

    如何将 RichTextBox 中的文本及其格式复制到写字板或网络浏览器 就像复制纯文本一样 您可以使用Clipboard SetText method http msdn microsoft com en us library 6eahs
  • VB.NET - 类中的扩展函数?

    我正在尝试创建一个类库 其中包含将二进制整数转换为十进制的函数 反之亦然 这样我就可以将其导入到另一个项目中 而无需重写该函数 它工作得很好 这是课程的一部分 Public Class BinaryDenary Public Shared
  • 如何在 XAML/WPF 中存储和检索多个形状?

    使用 XAML WPF 做一些简单的事情似乎遇到了很多问题 我已经使用矩形和椭圆形等形状创建了一些基于 XAML 的图像来创建我需要应用程序的其他部分使用的图标 但我不能似乎找到了如何做到这一点 我似乎能够在资源字典中存储画布 但无法在任何
  • 如何使用 VB.NET 以编程方式在 Richtextbox 中添加粗体文本

    我有这个代码 print text Text Patient number ds Tables patients Rows 0 Item 0 print text AppendText Environment NewLine print t
  • 将跟踪输出重定向到控制台

    假设我正在 VB Net 中开发一个小型批处理控制台应用程序 我希望能够像这样构建应用程序 Sub WorkerMethod Do some work Trace WriteLine Work progress Do more work T
  • Objective c,实例成员的内存管理

    我对实例成员的内存管理感到困惑 我有一个带有 ivar 的课程 DetailedResultsTableViewController detailedResultsTableViewController and property nonat
  • Kotlin 协程 - 优雅地处理挂起函数中的错误

    尝试使用从异步方法调用的挂起函数来实现对错误的优雅处理 如何捕获挂起方法引发的错误 suspend fun findById id Long User throw Exception my exception intentionally t
  • 读取 .ini 文件 vb.net?

    我有一个具有读取 ini 文件功能的项目 我无法显示我想要的 ini 文件的内容 我的代码读取 ini 文件 Public Function GetSettingItem ByVal File As String ByVal Identif
  • 使用 Canon EDSDK 2.5.2 VB.NET 实时查看

    我正在尝试做两件事中的一件 第一件事 使用 VB NET 和 Canon EDSDK 2 5 2 打开实时视图 并在 Windows 窗体应用程序中渲染实时输出 目前我正在尝试将其放入图片框 不过 我肯定愿意接受建议 第二个选项是至少打开实
  • 终止以 System.Diagnostic.Process.Start("FileName") 启动的进程

    我正在尝试创建一个将在特定时间执行操作的应用程序 很像 Windows 任务计划程序 我当前正在使用 Process Start 来启动任务所需的文件 或 exe 我通过调用文件 mp3 启动一个进程 该进程启动 WMP 因为它是默认应用程
  • Office 365 和经典 ASP 与 VB.net SMTP 设置

    有几个关于经典 ASP 和 Office 365 的问题 但似乎没有一个问题可以回答我的特定场景 所以这里是 我在 Office 365 上设置了一个电子邮件帐户 并尝试使用以下代码进行 SMTP 测试 Dim ObjSendMail ma

随机推荐

  • 如何从 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