作者:小鬼快乐momomo | 来源:互联网 | 2023-05-17 19:40
两个问题1.有一个Timer,每5秒执行一次给DataTable赋值,前台页面展示DataTable的数据2.类中有很多静态哈希表或者静态DataTable,里面存放很多计算用的数据
两个问题
1. 有一个Timer,每5秒执行一次 给DataTable赋值,前台页面展示DataTable的数据
2. 类中有很多静态哈希表或者静态DataTable,里面存放很多计算用的数据
请问,这样执行一天,为什么程序占用的内存会增大很多呢,要怎样优化???
下面是这个类大概的内容
//这个HashTable里面大概有五百条数据,程序会一直用这个HashTable
public static HashTable ht = new HashTable();
DataTable dt = new DataTable();
private void timer1_Tick(object sender, System.Timers.ElapsedEventArgs e)
{
dt.Clear();
dt.Dispose();
dt = SqlHelper.ExecuteDT("select * from table1");
}
20 个解决方案
增大多少?一般情况下,如果出现内存泄露,你的程序跑不了一天.
dt.Clear();
dt.Dispose();
这两句代码其实没有用
dt是引用类型
你为dt指向了新的实例,旧的实例就会自动被回收了.
所以内存泄露不是dt的问题,找找别的原因吧
DataTable dt = new DataTable();
这句代码其实也没有用
每次你都是从SqlHelper.ExecuteDT()这个函数里返回新的实例,而不是用它来填充旧的数据表
所以你最初new的空表就被丢弃了
看到
dt.Clear();
我感觉你这样就不太好,如果每次只有少量的东西更新,为什么不更改控件内容
LZ可以试试 只在timer里输出hello看看内存会不会增长...
我做过测试是这样的 一个timers.timer执行内存就一直涨 所以跟dt还是ht无关.
可以考虑使用缓存,定时更新缓存,前端取缓存内容即可。
table1在不断增大,你全搞来,内存当然要增大喽
现在是只要关闭,再重新打开,内存就降到很低,然后又逐渐上升,这是典型的内存泄露