更改全局静态变量内存会继续消耗吗?

时间:2014-02-26 02:51:19

标签: c# memory

下面的代码创建一个全局变量来存储文本文件txt word.txt的内容,然后创建一个监视器来监视word.txt中的变化,如果内容改变word.txt重置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 个答案:

答案 0 :(得分:1)

首先,字符串是不可变的。这意味着......你没有改变内存中的值:你在内存中创建一个全新的值并指向它。

通常情况下,你会认为这会立即清除你在内存中的100MB字符串(好吧,当垃圾收集器到达它时不会立即清除)。但事实并非如此。

再次(与我之前发布的另一个答案一样),这是因为您的100MB字符串实际上是在大对象堆上分配的。直到所有代的完整垃圾收集才收集此内存..并且它没有被压缩。因此,您的内存使用量将继续保持很高。但是,CLR将在此堆中的其他大对象中分配现在为空的空间。

您可能对以下阅读材料感兴趣: