2014-02-26 28 views
0

以下代碼創建一個全局變量來存儲文本文件txt word.txt的內容,然後創建一個監視器來監視word.txt中的更改,如果內容更改word.txt reset txt變量。運行該程序後,如果我的word.txt內容填充100MB,內存使用量自然會增加,但是接下來我會將word.txt內容轉換爲只有一個字符,內存佔用不下來,但會增加少一些。更改全局靜態變量內存將繼續消耗?

public class Program 
{ 
public static string txt = "aaa"; 
static void Main() 
{ 
    FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(@"D:\ConsoleApplication1", "word.txt"); 
    fileSystemWatcher.Changed += new FileSystemEventHandler(ReloadHandler); 
    fileSystemWatcher.NotifyFilter = NotifyFilters.Size; 
    fileSystemWatcher.EnableRaisingEvents = true; 
    Console.ReadLine(); 
} 

private static void ReloadHandler(object sender, FileSystemEventArgs e) 
{ 
    ReloadTxtContent(); 
} 

private static void ReloadTxtContent() 
{ 
    txt = null; 
    using (FileStream fs = new FileStream(@"D:\ConsoleApplication1\word.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    { 
    using (StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default)) 
    { 
     txt = sr.ReadToEnd(); 
    } 
    } 
} 
} 

全局靜態變量賦值是否會反覆增加內存使用量?已被裁減?

回答

1

首先,字符串是不可變的。這意味着......你並沒有改變記憶中的價值:你在記憶中創造了一個全新的價值並指向了這個價值。

通常情況下,您會認爲這會立即清除內存中的100MB字符串(當垃圾收集器到達時,不會立即刪除)。然而,這種情況並非如此。

再次(與我之前發佈的另一個答案一樣),這是因爲您的100MB字符串實際上分配在大對象堆中。這個內存不會被收集,直到所有世代的完整垃圾收集..並且它沒有被壓縮。因此,您的內存使用量將繼續非常高。然而,CLR將在現在空的空間中的堆中分配其他大對象。

你可能會喜歡下面的閱讀材料:

+0

小對象相同 – LooseLive

+0

是的,但是更小的物體都在GC代。他們被收集和壓縮。 LOH沒有被壓縮,因此記憶「使用量」仍然很高。如果指定它,它可以在.NET 4.5中進行壓縮。但是在每次Gen 2收集期間,您都會遇到性能問題。 –