VB.NET内存管理

bnlyeluc  于 2023-01-06  发布在  .NET
关注(0)|答案(5)|浏览(313)

更新:我可能混淆了内存使用问题与UI共享相同的线程作为处理(如下面的MusiGenesis所指出的)。然而关于内存使用。我仍然无法找到VB.net的具体语法,虽然人们已经指出了一些伟大的.Net和C#信息如下(如果我更精通这些技术,一个可以适应与VB.net工作)。
我正在创建一个VB .NET应用程序。

  • 应用程序基本上将位于客户机上的数据文件解析为DataSet/DataTable。
  • 然后使用DataView将DataTable分解为可管理的块,写入XML并将XML数据发送到Web服务。

一般的概念是工作正常,但我有问题的记忆使用任务管理器不断增长,因为该程序是用来加载越来越多的文件。
在启动时,在执行任何操作之前,VB应用程序有27,000 K。一旦文件被解析,甚至在我处理了文件句柄以及数据之后,数据增加了很多。我把代码中的所有东西都去掉了,似乎内存使用中的内存仍然被捕获。内存使用增长的原因是没有规律的(IidoEe.有时当阅读7 MB文件时,它可以增长20 MB,但其他时候当读取3 MB文件时,它根本不增长)。有时,它似乎在解析完成时释放一些内存,其他时候它只是保持。
我看过.Net内存分析器,并没有真正能够从中得出结论。
我在网上读了很多关于.Net上内存管理的书,一般是关于Dispose和“Nothing”以及DataSets等,但是还没有真正找到任何关于VB.Net的具体内容。

我的一般问题是:有没有好的教程/书籍/博客/等,显示了更深入的教程管理内存在VB.Net应用程序(即如何/何时处置/关闭等),或者有人有一些具体的提示,从那里的经验。

7eumitmz

7eumitmz1#

首先,您需要了解任务管理器显示的是操作系统分配给应用程序的内存量。这不一定是实际使用的内存量。当.NET应用程序首次启动时,操作系统会为其分配内存。就像它对任何进程所做的那样。2然后.NET运行时进一步划分内存并管理它的使用。3运行时可以被认为是“贪婪的”因为一旦内存被操作系统分配,除非操作系统特别要求,否则它不会将其归还。结果是任务管理器中的内存使用不准确。
要获得内存使用的真实情况,您需要使用性能监视器并添加适当的计数器。
至于IDisposable和dispose模式,你可能不会发现很多语言特定的术语,因为它是由.NET框架本身提供的,并且是语言不可知的。无论你使用什么语言,模式都是相同的,只是语法不同。
有几个参考资料可以给予内存管理工作原理的信息,我有两篇博客文章,一篇讨论了Using Garbage Collection in .NET,一篇列出了我用来创建两个关于. NET中内存管理的演示文稿的各种resources
最好的“经验法则”是,如果一个类实现了IDisposable,那么它这样做是有原因的,并且您应该确保在使用完示例后调用Dispose(),这最容易通过using语句实现。

c0vxltue

c0vxltue2#

VB .NET中的内存管理实际上是由.Net Framework处理的,所以一般来说,VB .NET中的内存管理与C#中的内存管理是一样的。然而,了解它是如何工作的,可以让您做出更好的编程决策--何时声明变量,何时释放对象,在这种上下文中,我认为您的问题可以被构造为“有没有好的资源可以告诉我如何高效地编码并获得更小的内存占用”,或者“有没有人能告诉我为什么会发生这种奇怪的事情”。这两个问题都可以通过更全面地了解.Net如何管理内存、作用域等来回答。有大量的资源可以回答这个问题,
也就是说,第一个链接有很多其他的链接,将对你有用:
http://geekswithblogs.net/sdorman/archive/2008/09/14/.net-memory-management-ndash-resources.aspx
第二个问题更切中要害:
http://www.c-sharpcorner.com/UploadFile/tkagarwal/MemoryManagementInNet11232005064832AM/MemoryManagementInNet.aspx

r7knjye2

r7knjye23#

如果我是你,我会首先使用一个分析器来查看应用程序到底在做什么。有几个- JetBrains,RedGate,YourKit。从那里你可以看到到底哪里的内存没有被释放。
然后,您可以看到您需要集中精力纠正问题的确切位置

lnlaulya

lnlaulya4#

这不是对您的一般问题的回答,但是您可以直接将DataTable发送到Web服务,而无需先将其写入XML这一中间步骤。实际上,您不能发送DataTable,但可以发送DataSet(因为DataSet可序列化,而DataTable不可序列化),因此,您可以直接发送数据表,方法是先将其 Package 在数据集中,然后再发送该数据集。SOAP协议无论如何都会将数据集转换为XML,因此您自己将DataTable转换为XML实际上没有任何好处。
从您的问题中,我猜您的DataTable太大,无法一次发送所有数据,或者您正在将它们分成较小的块,以便客户端应用程序可以向用户指示进度。这也可以在不将内容写入XML的情况下完成。
关于你的一般性问题,当阅读(和发送)一个7mb的文件时,内存消耗会增加20mb,这并不奇怪。用于描述DataTable及其内容的XML(无论是你自己做的,还是当你直接将其发送到Web服务时自动序列化的)是非常冗长的。
解决这个问题最有效的方法是将客户端的数据文件直接发送到Web服务(作为一个byte[]数组或一系列byte[]数组),然后在服务器上处理这些文件。这种方法将最大限度地缩短将每个文件发送到服务器所需的时间(因为发送7mb比发送20mb甚至更多所需的时间要少)。

uidvcgyl

uidvcgyl5#

我读过的关于这个主题的最好的书是Jeff Richter的书,CLR via C#:
http://www.amazon.com/CLR-via-Second-Pro-Developer/dp/0735621632/ref=sr_1_1?ie=UTF8&qid=1252853101&sr=8-1-spell
如果你想要一个VB.NET版本,他们在第一版的书中就有了,但是我认为在第二版的书中没有足够的兴趣把它翻译成VB.NET。如果你想真正学习.NET,你应该熟悉C#。在这两种语言中,内存都是由CLR管理的。

相关问题