繁体   English   中英

VB.NET内存管理

[英]VB.NET Memory Management

更新:我可能将内存使用问题与UI共享相同的线程与处理相混淆(如下面的MusiGenesis所指出的)。 但是关于内存使用情况。 我仍然无法找到VB.net特定的语法,尽管人们已经在下面指出了一些很棒的.Net和C#信息(如果我对这些技术更精通,那么可以适应VB.net的工作)。

我正在创建一个VB.Net应用程序。

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

一般概念工作正常,但是我遇到的问题是,当程序用于加载越来越多的文件时,任务管理器上的Mem Usage不断增长。

在启动时,在执行任何操作之前,VB应用程序有27,000 K.一旦解析了文件,甚至在我处理File句柄之后,数据也会增加很多。 我删除了代码中的所有内容,似乎仍然捕获了Mem Usage中的内存。 关于为什么Mem Usage正在增长没有任何押韵或理由(即,有时它在读取7mb文件时可以增长20mb,但有时它在读取3mb文件时根本没有增加)。 有时,它会在解析完成时释放一些内存,而其他时候只是保留。

我看过.Net Memory Profiler并没有真正能够做到这一点。
我已经在互联网上阅读了很多关于.Net的内存管理,关于Dispose和“Nothing”以及DataSet等等,但是并没有真正发现任何关于VB.Net的内容。

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

首先,您需要意识到任务管理器正在向您显示操作系统已分配给您的应用程序的内存量。 这不一定是实际使用的内存量。 当.NET应用程序首次启动时,操作系统会为其分配内存,就像对任何进程一样。 然后,.NET运行时进一步划分该内存并管理它的使用方式。 运行时可以被认为是“贪婪”,因为一旦操作系统分配了内存,除非操作系统特别要求,否则它不会将其返回。 结果是任务管理器中的内存使用不准确。

要准确了解内存使用情况,您需要使用性能监视器并添加适当的计数器。

至于IDisposable和dispose模式,你可能不会发现很多用语言特定的术语来讨论它,因为它是由.NET Framework本身提供的并且与语言无关。 无论您使用何种语言,模式都是相同的,只有语法不同。

有几个参考资料可以为您提供有关内存管理如何工作的信息。 我有两个博客文章,一个讨论在.NET中使用垃圾收集 ,另一个列出我用于在.NET中创建内存管理的两个演示文稿的各种资源

最好的“经验法则”是,如果一个类实现了IDisposable ,它会出于某种原因这样做,你应该确保在完成使用实例时调用Dispose() using语句最容易实现。

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

如果我是你,我会首先利用一个分析器来确切了解应用程序正在做什么。 有几个 - JetBrains,RedGate,YourKit。 从那里你可以看到内存未被释放的确切位置。

然后,您可以看到您需要集中精力来纠正问题

这不是您的一般问题的答案,但您可以将DataTable直接发送到Web服务,而无需先将其写入XML的中间步骤。 实际上,您不能发送DataTable,但是您可以发送DataSet(因为DataSet是可序列化的,而DataTable不是),因此您可以通过首先将其包装在DataSet中然后发送DataSet来直接发送DataTable。 SOAP协议无论如何都将DataSet转换为XML,因此您自己并没有通过将DataTable转换为XML来获得任何东西。

我猜你的问题是你的DataTables太大而无法一次发送所有内容,或者你将它们分成更小的块,以便你的客户端应用程序可以向用户指示进度。 这也可以在不自己将内容写入XML的情况下完成。

关于你的一般问题,有时你的内存消耗在读取(和发送)7mb文件时会增加20mb也就不足为奇了。 用于描述DataTable及其内容的XML(无论您是自己动手还是直接将其发送到Web服务时自动序列化)都非常冗长。

解决此问题的最有效方法是将客户端的数据文件直接发送到Web服务(作为单个byte []数组或作为一系列byte []数组),然后完全在服务器上处理这些文件。 这种方法可以最大限度地缩短将每个文件发送到服务器所需的时间长度(因为发送7mb所需的时间比发送20mb甚至更多更少)。

我读过的最好的书是Jeff Richter的书,CLR来自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管理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM