У меня есть серьезная утечка памяти на одном из моих исполняемых файлов C# (это консольное приложение). Объем памяти увеличивается и сверхурочно мне нужно перезапустить приложение, чтобы снизить использование памяти. Я использую FileSystemWatcher, а затем, когда файл доступен, перейдя к его преобразованию в utf-8 и пересылая его. А затем напишите на консоль, что файл обрабатывается в это время. Поэтому он записывает на консоль каждый раз, когда обрабатывает ее.Идентификация утечки памяти
Я использую профилировщик памяти Ants и довольно свежий, чтобы начать использовать его. Я не могу понять это. Когда я беру снимок памяти, он показывает мне:
namespace: System, Classname: byte [] --- Это увеличивается каждый раз, когда обрабатывает файл и отображает его на консоли (на 40 000 байт) и никогда не возвращается ,
Это правильно.
Update:
class Class1
{
private static FileSystemWatcher watcher = new FileSystemWatcher();
public static void Main()
{
WatchFile();
Console.ReadLine();
}
private static void WatchFile()
{
watcher.Path = @"N:\";
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Filter = "*.xml";
watcher.Changed += new FileSystemEventHandler(convert);
watcher.Error += new ErrorEventHandler(WatcherError);
watcher.EnableRaisingEvents = true;
Console.WriteLine("Press \'q\' to quit.");
while (Console.Read() != 'q');
}
public static string CrL = "\r\n";
private static object lockObject = new object();
private static void convert(object source, FileSystemEventArgs f)
{
string FileName;
FileName = f.FullPath;
string destinationFile = @"F:\test.xml";
Thread.Sleep(2000);
if (!Monitor.TryEnter(lockObject))
{
return;
}
try
{
watcher.EnableRaisingEvents = false;
Thread.Sleep(2000);
var doc = new XmlDocument();
doc.Load(FileName);
XmlWriterSettings settings = new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true };
using (var writer = XmlWriter.Create(destinationFile, settings))
{
doc.Save(writer);
}
Console.WriteLine("File Copied" + " " + DateTime.Now.ToString("HH:mm:ss tt"));
Console.WriteLine("Press \'q\' to quit.");
Console.Write(CrL);
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.ToString());
}
finally
{
Monitor.Exit(lockObject);
watcher.EnableRaisingEvents = true;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
}
private class Utf8StringWriter : StringWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
}
private static void WatcherError(object source, ErrorEventArgs e)
{
Exception watchException = e.GetException();
watcher = new FileSystemWatcher();
while (!watcher.EnableRaisingEvents)
{
try
{
WatchFile();
Console.WriteLine("I'm Back!!");
}
catch
{
Thread.Sleep(2000);
}
}
}
}
Что вы спрашиваете? –
Можете ли вы показать код своего файлового обозревателя? Трудно сказать, что происходит по описанию. – Tim
Отредактировано для добавления кода – user726720