2014-02-26 30 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收集期间,您都会遇到性能问题。 –