热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DataTable多次赋值的时候,怎么在每次赋值前情况所占内存,避免内存浪费

两个问题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 个解决方案

#1


 增大多少?一般情况下,如果出现内存泄露,你的程序跑不了一天.

#2


内存会一直增大吗?

#3


引用 1 楼 caoqinghua 的回复:
 增大多少?一般情况下,如果出现内存泄露,你的程序跑不了一天.

程序倒是不太大,就是数据查询很频繁,刚开始程序几十兆,几天就能达到1G,前台是Winform图表

#4


引用 2 楼 FoxDave 的回复:
内存会一直增大吗?

内存会一直增大,直到提示内存不足  死机或者程序自动退出 

#5


dt.Clear();
dt.Dispose();
这两句代码其实没有用
dt是引用类型
你为dt指向了新的实例,旧的实例就会自动被回收了.
所以内存泄露不是dt的问题,找找别的原因吧

#6


DataTable dt = new DataTable();
这句代码其实也没有用
每次你都是从SqlHelper.ExecuteDT()这个函数里返回新的实例,而不是用它来填充旧的数据表
所以你最初new的空表就被丢弃了

#7


看到
 dt.Clear();
我感觉你这样就不太好,如果每次只有少量的东西更新,为什么不更改控件内容

#8


引用 5 楼 Z65443344 的回复:
dt.Clear();
dt.Dispose();
这两句代码其实没有用
dt是引用类型
你为dt指向了新的实例,旧的实例就会自动被回收了.
所以内存泄露不是dt的问题,找找别的原因吧

恩,说的有道理,我再试试

#9


LZ可以试试 只在timer里输出hello看看内存会不会增长...

我做过测试是这样的 一个timers.timer执行内存就一直涨 所以跟dt还是ht无关.

#10


引用 9 楼 diaodiaop 的回复:
LZ可以试试 只在timer里输出hello看看内存会不会增长...

我做过测试是这样的 一个timers.timer执行内存就一直涨 所以跟dt还是ht无关.

我做过一个测试,新建个窗体工程,啥都没加
在我笔记本上跑,内存就会莫名其妙的增长
在台式机上跑,就啥问题没有

#11


引用 10 楼 Z65443344 的回复:
Quote: 引用 9 楼 diaodiaop 的回复:

LZ可以试试 只在timer里输出hello看看内存会不会增长...

我做过测试是这样的 一个timers.timer执行内存就一直涨 所以跟dt还是ht无关.

我做过一个测试,新建个窗体工程,啥都没加
在我笔记本上跑,内存就会莫名其妙的增长
在台式机上跑,就啥问题没有

而且为了排除VS的原因,我还是直接双击EXE运行的

#12


引用 9 楼 diaodiaop 的回复:
LZ可以试试 只在timer里输出hello看看内存会不会增长...

我做过测试是这样的 一个timers.timer执行内存就一直涨 所以跟dt还是ht无关.

如果不用Timer,还有其他办法可以几秒钟执行一次吗 

#13


引用 10 楼 Z65443344 的回复:
Quote: 引用 9 楼 diaodiaop 的回复:

LZ可以试试 只在timer里输出hello看看内存会不会增长...

我做过测试是这样的 一个timers.timer执行内存就一直涨 所以跟dt还是ht无关.

我做过一个测试,新建个窗体工程,啥都没加
在我笔记本上跑,内存就会莫名其妙的增长
在台式机上跑,就啥问题没有

我之前也测试过,Timer在服务器上执行几天没有问题,  就这样的定时执行  还有没有其它解决办法?

#14


可以考虑使用缓存,定时更新缓存,前端取缓存内容即可。

#15


table1在不断增大,你全搞来,内存当然要增大喽

#16


引用 15 楼 u012570183 的回复:
table1在不断增大,你全搞来,内存当然要增大喽

这不对
按这个理论,即使关闭程序,重新开启,内存也应该一下变得很大,而不是逐渐上升

#17


现在是只要关闭,再重新打开,内存就降到很低,然后又逐渐上升,这是典型的内存泄露

#18


你可以用线程或者异步试试.

#19


试一试GC.Collect()呢

#20


引用 17 楼 Z65443344 的回复:
现在是只要关闭,再重新打开,内存就降到很低,然后又逐渐上升,这是典型的内存泄露

说的很对,找到原因了,之前一个人写的静态变量List,每次计算都往里面添加大概一百多条数据,导致List一直增大,现在已经修改了,内存保持在50M左右 没有再增大,  真是一个Bug毁了整个程序啊,   非常感谢你,也谢谢所有人的回复

#21


  • 求解释:内存中赋值操作的过程

推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
author-avatar
小鬼快乐momomo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有