抛出了类型'System.OutOfMemoryException'的异常

vbN*_*bie 3 .net out-of-memory

我突然得到了在不同机器上运行的两个程序的内存异常错误,即使看起来有足够的内存,它仍然显示出来.我正在程序中创建多个线程,所以不确定这是否适合这个论坛,但它可能是与visual studio相关的东西,或者它肯定是内存问题.一个程序在我的桌面上使用visual studio 2008和2 gb ram运行.另一个使用visual basic 2008 express在运行4 GB RAM的Windows 2003服务器上运行.现在,模块将一个大的xml文件读入一个字符串,然后拆分并存储在一个字符串数组中.现在块的数量可以达到10000.现在我知道这很大,但我已经运行了一个多月了,从来没有遇到过这个问题.我注意到的另一个可能的相关问题是我的硬盘驱动器上的空间不足,但很快就通过清理解决了这个问题.哦,是的,我的机器的处理器是一个设置在2.13 GHZ的双核心.它是一个控制台程序,可以生成多个Web请求,但内存问题只出现在一个特定模块中,正如我上面所解释的那样.

Public Shared Function textLoad(ByVal _html As String) As Boolean
    Try 
            //_html is the filestream that was read in

        Dim defaultHeading = "xmlns:gnip=""http://www.gnip.com/schemas/2010"" xmlns=""http://www.w3.org/2005/Atom"""
        Dim header_of_xml As String = "<?xml version=""1.0"" encoding=""utf-8""?>" & vbNewLine & "<entry " & defaultHeading & ">"
        Dim footer_of_xml As String = "</entry>"
        Dim entry As String = String.Empty
        Dim xrs As XmlReaderSettings = New XmlReaderSettings()
        Dim dupeArray As New ArrayList
        Dim stringSplitter() As String = {"</entry>"}

        //split the file content based on the closing entry tag
        sampleResults = Nothing
        sampleResults = _html.Split(stringSplitter, StringSplitOptions.RemoveEmptyEntries)
        entryResults.Clear()

        If getEntryId(sampleResults) Then
           // the following loops seem clumsy but I wanted to dedupe the lists to //ensure that I am not adding duplicate entries and I do this by going to the getEntryID //method and extracting the ids and then comparing them below 

            For i As Integer = 0 To sampleResults.Count - 1
                For j As Integer = 0 To idList.Count - 1
                    If sampleResults(i).Contains(idList.Item(j)) AndAlso Not dupeArray.Contains(idList.Item(j)) Then
                        dupeArray.Add(idList.Item(j))
                        entry = sampleResults(i)
Run Code Online (Sandbox Code Playgroud)

我确实看过taskmanager来识别这个程序使用的资源,这是正在发生的事情:

Parser.exe CPU = 34 MEM使用率= 349,500 K.

没有别的东西在运行

编辑_ -

找出问题的确切位置:

**sampleResults = _html.Split(stringSplitter, StringSplitOptions.RemoveEmptyEntries)**
Run Code Online (Sandbox Code Playgroud)

谁能注意到这个有什么问题?

mat*_*fin 9

Split方法为返回数组中的每个元素分配字符串对象的内存.如果你要遇到内存问题,它就会出现在那条线上.由于您在一个可能碎片堆上同时为可能10,000个大字符串分配内存,因此您可能无法找到足够的连续空间来分配下一个字符串(这会产生结果)并不奇怪在您遇到的例外中).你真的需要所有这些字符串吗?或者你可以做这样的循环:

  1. 一次读取一行(或读入缓冲区)以构建字符串.
  2. 当你找到第一个"块"时停止.
  3. 从块中获取所需的信息.(我假设你不需要整件事,你只是想从中得到一些东西吗?).
  4. 继续阅读html(在#1重启),将其读入相同的字符串变量,以便第一个块可以收集垃圾.

如果您能以这种方式实施解决方案,那么您的问题应该会消失.


Cod*_*aos 5

请注意,OOM 并不意味着物理 RAM 不足,而是意味着您无法将所需大小的新内存块放入地址空间。

造成这种情况的可能原因有很多

  • 堆碎片
  • 32 位进程的 2GB 限制
  • 配置中设置的最大内存大小

然后还有假的 OOM 异常。例如,GDI+ 会针对包括无效参数在内的多种问题返回内存不足错误。这些也会变成 OOM 异常。