下面的代码创建一个全局变量来存储文本文件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();
}
}
}
}
全局静态变量赋值是否会反复增加内存使用量?已被削减?
答案 0 :(得分:1)
首先,字符串是不可变的。这意味着......你没有改变内存中的值:你在内存中创建一个全新的值并指向它。
通常情况下,你会认为这会立即清除你在内存中的100MB字符串(好吧,当垃圾收集器到达它时不会立即清除)。但事实并非如此。
再次(与我之前发布的另一个答案一样),这是因为您的100MB字符串实际上是在大对象堆上分配的。直到所有代的完整垃圾收集才收集此内存..并且它没有被压缩。因此,您的内存使用量将继续保持很高。但是,CLR将在此堆中的其他大对象中分配现在为空的空间。
您可能对以下阅读材料感兴趣: