2011-07-07 56 views

回答

2

因爲有很多不同的因素進入OOM例外。從"Out Of Memory" Does Not Refer to Physical Memory開始。

的「內存不足」的錯誤幾乎不會發生,因爲沒有足夠的可用存儲空間......相反,一個「內存不足」的錯誤發生,因爲這個過程是無法找到連續的未使用的頁的足夠大的部分在其虛擬地址空間中執行請求的映射。

您還應該閱讀CLR Inside Out - Investigating Memory Issues

如果虛擬內存過於分散,進程可能會用盡虛擬空間。

所以,不要只看你的文件大小和頁面文件的大小,你需要檢查你的應用程序正在做什麼,甚至是什麼其他進程在系統上運行。

1

我是新手,但我在我的一些更多的內存密集型應用程序的使用這段代碼:


Declare Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal process As IntPtr, ByVal minimumWorkingSetSize As Integer, ByVal maximumWorkingSetSize As Integer) As Integer 
Private Shared Sub _FlushMemory() 
    Try 
     GC.Collect() 
     GC.WaitForPendingFinalizers() 
     If (Environment.OSVersion.Platform = PlatformID.Win32NT) Then 
      SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1) 
      Dim myProcesses As Process() = Process.GetProcessesByName(My.Application.Info.AssemblyName) 
      Dim myProcess As Process 
      For Each myProcess In myProcesses 
       SetProcessWorkingSetSize(myProcess.Handle, -1, -1) 
      Next myProcess 
     End If 
    Catch ex As Exception 
    End Try 
End Sub 
+0

這是什麼?它爲什麼有效?如果內存運行嚴重不足,你會不會認爲內存管理器已經爲你做到了這一點? –

+0

它清除程序中未使用的內存(來自舊變量等)並將內存分配設置爲儘可能最低,同時保留包含所需變量等的內存。 並且沒有。當內存運行嚴重不足時,內存可能會被清除,但當您只想釋放一些未使用的內存時,內存可能會被清除,從而使您的應用程序保持高效。我在一個定時器上使用它,並且在合理的時間間隔內,在可能需要在操作之後進行一些清理的表單上 - 您可以在任務管理器中看到,內存被降低到可能的最低程度。 (相當令人滿意) – SolaGratia

0

只注意到你寫什麼也。您不能將字符串數組(String)(ReadAllLines)轉換爲字符串。

試試這個:

Dim output1 As String = IO.File.ReadAllText(file)

這將返回該文件的內容作爲String。如果這是你想要的。

+0

那他應該怎麼做呢?你會如何重寫代碼來修復它? –

+0

如果我一直在尋找一個字符串數組: 昏暗的輸出1()作爲字符串= IO.File.ReadAllLines(文件) 或者,如果我想要的文件作爲字符串的內容, 昏暗輸出1作爲字符串= 10 .File.ReadAllText(文件) – SolaGratia

相關問題