windows 表单方法的高内存使用率
High memory usage of a windows forms method
我有一个使用过多内存的 c# windows 表单应用程序。代码和平,问题是这个
private void mainTimer_Tick(object sender, EventArgs e)
{
try
{
if (DateTime.Now.DayOfWeek == DayOfWeek.Saturday)
{
if (File.Exists(Globals.pathNotifFile + "1"))
{
File.Delete(Globals.pathNotifFile + "1");
File.Move(Globals.pathNotifFile, Globals.pathNotifFile + "1");
}
File.Move(Globals.pathNotifFile, Globals.pathNotifFile + "1");
}
if (DateTime.Now.DayOfWeek == DayOfWeek.Sunday)
{
return;
}
if (Globals.shotsFired != true)
{
CreateDLclient();
Globals.shotsFired = true;
}
if (Globals.pathNotifFile == null)
{
return;
}
var data = Deserialize();
foreach (var notifyData in data.@new)
{
if (notifyData.Status == "1" || notifyData.Status == string.Empty)
{
if (DateTime.Now >= Convert.ToDateTime(notifyData.DateTime))
{
if (notifyData.Message != string.Empty)
{
notifyData.Status = SendMessageToUser(notifyData.Message, notifyData.Company, notifyData.EmojiCode);
Serialize(data);
}
else
{
notifyData.Status = "3";
Serialize(data);
}
}
else if (DateTime.Now >= Convert.ToDateTime(notifyData.DateTime).AddMinutes(5))
{
if (notifyData.Message != string.Empty)
{
notifyData.Status = SendMessageToUser(notifyData.Message, notifyData.Company, notifyData.EmojiCode);
Serialize(data);
}
else
{
notifyData.Status = "3";
Serialize(data);
}
}
}
}
}
它导致了一个大问题,应用程序崩溃 'out of memory' 有人可以给我一个建议,我怎样才能减少它的内存使用量。我试图调用 GC /我知道这不是一个好主意/,但它没有帮助。
提前致谢
您没有提供有关您在程序中使用哪个序列化程序的任何信息,但我很倾向于认为它是 XMLSerializer
,因为它很容易发生内存泄漏,并且您在评论中说该程序是工作超过 10-12 小时后崩溃。
XmlSerializer
使用程序集生成,无法收集程序集。据我所知,它做了一些缓存以供重用,但仅适用于简单的情况。
所以如果你有像下面这样经常被调用的代码→
XmlSerializer xml = new XmlSerializer(typeof(MyObject), ....
那你迟早会出内存异常
编辑:如何避免 XMLSerializer 的内存泄漏:
请看题目
动态生成的程序集如下link→MSDN Link
如果我只是总结一下里面写的是什么,你有几种方法。
1) 可以使用下面的构造函数来避免动态组装
XmlSerializer.XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
2) 使用字典或哈希表,创建您自己的缓存
private Dictionary<Tuple<Type, XmlRootAttribute>, XmlSerializer> cacheSerializer = new Dictionary<Tuple<Type, XmlRootAttribute>, XmlSerializer>();
public XmlSerializer GetXmlSerializer(Type type, XmlRootAttribute root) {
var key = Tuple.Create(type, root);
XmlSerializer xmlSerializer;
if (cacheSerializer.TryGetValue(key, out xmlSerializer)) {
return xmlSerializer;
}
xmlSerializer = new XmlSerializer(type, root);
cacheSerializer.Add(key,xmlSerializer);
return xmlSerializer;
}
我有一个使用过多内存的 c# windows 表单应用程序。代码和平,问题是这个
private void mainTimer_Tick(object sender, EventArgs e)
{
try
{
if (DateTime.Now.DayOfWeek == DayOfWeek.Saturday)
{
if (File.Exists(Globals.pathNotifFile + "1"))
{
File.Delete(Globals.pathNotifFile + "1");
File.Move(Globals.pathNotifFile, Globals.pathNotifFile + "1");
}
File.Move(Globals.pathNotifFile, Globals.pathNotifFile + "1");
}
if (DateTime.Now.DayOfWeek == DayOfWeek.Sunday)
{
return;
}
if (Globals.shotsFired != true)
{
CreateDLclient();
Globals.shotsFired = true;
}
if (Globals.pathNotifFile == null)
{
return;
}
var data = Deserialize();
foreach (var notifyData in data.@new)
{
if (notifyData.Status == "1" || notifyData.Status == string.Empty)
{
if (DateTime.Now >= Convert.ToDateTime(notifyData.DateTime))
{
if (notifyData.Message != string.Empty)
{
notifyData.Status = SendMessageToUser(notifyData.Message, notifyData.Company, notifyData.EmojiCode);
Serialize(data);
}
else
{
notifyData.Status = "3";
Serialize(data);
}
}
else if (DateTime.Now >= Convert.ToDateTime(notifyData.DateTime).AddMinutes(5))
{
if (notifyData.Message != string.Empty)
{
notifyData.Status = SendMessageToUser(notifyData.Message, notifyData.Company, notifyData.EmojiCode);
Serialize(data);
}
else
{
notifyData.Status = "3";
Serialize(data);
}
}
}
}
}
它导致了一个大问题,应用程序崩溃 'out of memory' 有人可以给我一个建议,我怎样才能减少它的内存使用量。我试图调用 GC /我知道这不是一个好主意/,但它没有帮助。
提前致谢
您没有提供有关您在程序中使用哪个序列化程序的任何信息,但我很倾向于认为它是 XMLSerializer
,因为它很容易发生内存泄漏,并且您在评论中说该程序是工作超过 10-12 小时后崩溃。
XmlSerializer
使用程序集生成,无法收集程序集。据我所知,它做了一些缓存以供重用,但仅适用于简单的情况。
所以如果你有像下面这样经常被调用的代码→
XmlSerializer xml = new XmlSerializer(typeof(MyObject), ....
那你迟早会出内存异常
编辑:如何避免 XMLSerializer 的内存泄漏: 请看题目 动态生成的程序集如下link→MSDN Link 如果我只是总结一下里面写的是什么,你有几种方法。
1) 可以使用下面的构造函数来避免动态组装
XmlSerializer.XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
2) 使用字典或哈希表,创建您自己的缓存
private Dictionary<Tuple<Type, XmlRootAttribute>, XmlSerializer> cacheSerializer = new Dictionary<Tuple<Type, XmlRootAttribute>, XmlSerializer>();
public XmlSerializer GetXmlSerializer(Type type, XmlRootAttribute root) {
var key = Tuple.Create(type, root);
XmlSerializer xmlSerializer;
if (cacheSerializer.TryGetValue(key, out xmlSerializer)) {
return xmlSerializer;
}
xmlSerializer = new XmlSerializer(type, root);
cacheSerializer.Add(key,xmlSerializer);
return xmlSerializer;
}