昨天做了一个自动生成Insert 语句的小工具,今天测试发现存在严重的内存泄漏问题,代码看了好几遍,没发现问题。后来用 .Net Memory Profiler 跟踪(跟踪方法见 用 .NET Memory Profiler 跟踪.net 应用内存使用情况--基本应用篇) 发现有数千个DataRow 没有释放,最后定位是DataTable.NewRow 的问题。

  先看一下有问题的代码

public DataRow GetNextRow(){if (_DataReader.Read())    {        DataRow row = _SchemaTable.NewRow();foreach (DataColumn col in _SchemaTable.Columns)        {            row[col.ColumnName] = _DataReader[col.ColumnName];        }                return row;    }else    {return null;    }}

  这段代码我希望通过SqlDataReader 对象 _DataReader 来获取一行数据。_SchemaTable 是一个DataTable 对象,这个DataTable对象没有记录,只存放Table 的Schema。乍一看好像没有什么问题,_SchemaTable.NewRow() 是根据_SchemaTable 的列信息生成一个新行,但这个新行并没有调用 _SchemaTable.Rows.Add 方法加入到_SchemaTable 表中,一般认为这个新生成的 DataRow 在使用完后会被自动回收,但实际情况并不是这样,只要_SchemaTable 不释放,_SchemaTable.NewRow 生成的所有DataRow都无法释放。

  网上搜了一下,有一位仁兄和我遇到同样问题 Table NewRow() Causes Memory Leak

  被采纳的解决意见是这样的:

  DataTable.NewRow() adds the created row to the DataTable's RecordManager. I am not entirely sure why this happens, but this is why it is not freed by the GC.

  It appears that there are only two ways to get rid of the DataRow:

  1. Add it to the table, then delete it.
  2. Call DataTable.Clear().

  也就是说DataTable.NewRow 方法创建的DataRow 对象会被加入到DataTable 的 RecordManager 中,我们可以通过以下两种方法来释放掉它:

  1. 通过 DataTable.Rows.Add 方法将这一行加入到DataTable 中,然后再通过 DataTable.Rows.Remove 方法删除它。

  2. 调用 DataTable.Clear() 方法释放。

  由于我这个应用中数据表只存放架构信息,始终是空表,所有我采用了第2种方法。加入 _SchemaTable.Clear() 这一句后内存泄漏问题解决。

  改正后的代码如下:

public DataRow GetNextRow(){if (_DataReader.Read())    {        DataRow row = _SchemaTable.NewRow();foreach (DataColumn col in _SchemaTable.Columns)        {            row[col.ColumnName] = _DataReader[col.ColumnName];        }        _SchemaTable.Clear();return row;    }else    {return null;    }}

  不好意思,上面代码还是有问题, _SchemaTable.Clear() 后DataRow 里面的数据都会被清空,必须在调用完新生成的DataRow后再 _SchemaTable.Clear 才行,特此更正。

艾伟_转载:DataTable.NewRow 内存泄漏问题相关推荐

  1. 艾伟_转载:.NET内存管理、垃圾回收

    1. Stack和Heap 每个线程对应一个stack,线程创建的时候CLR为其创建这个stack,stack主要作用是记录函数的执行情况.值类型变量(函数的参数.局部变量 等非成员变量)都分配在st ...

  2. eclipse无法创建java虚拟机_手把手:Java内存泄漏分析Memory Analyzer Tool

    点击上方"IT牧场",选择"设为星标"点击上方"IT牧场",选择"设为星标"技术干货每日送达 阅读文本大概需要3分钟. ...

  3. jstat 内存泄漏_一次Java内存泄漏的排查!要了自己的老命!

    点击上方"Java之间",选择"置顶或者星标" 你关注的就是我关心的! 作者:枕边书 来源:https://zhenbianshu.github.io 一.由来 ...

  4. unity如何检测内存泄漏_如何排查Java内存泄漏?看懂这一篇就够用了

    原文:https://www.toptal.com/java/hunting-memory-leaks-in-java 作者:Jose Ferreirade Souza Filho 译者:Emma来源 ...

  5. 内存泄漏的原因及解决办法_浅谈 JS 内存泄漏问题

    什么是内存泄漏? 程序的运行需要内存.只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存. 对于持续运行的服务进程(daemon),必须及时释放不再用到的内存.否则,内存占用越来越高 ...

  6. 【转载】gdi+ 内存泄漏

    [转载]http://issf.blog.163.com/blog/static/1941290822009111894413472/ 最近用GDI+实现了几个自定义控件,但是发现存在内存泄露问题 B ...

  7. 艾伟_转载:探索.Net中的委托

    废话 我本来以为委托很简单,本来只想简简单单的说说委托背后的东西,委托的使用方法.原本只想解释一下那句:委托是面向对象的.类型安全的函数指针.可没想到最后惹出一堆的事情来,越惹越多,罪过,罪过.本文后 ...

  8. 艾伟_转载:Cookie是什么?用法是怎样?与SESSION有什么区别?(二)

    二session 简介 IE中: 有效的窗品包括 1.Session对象只在建立Session对象的窗口中有效. 2.在建立Session对象的窗口中新开链接的窗口 无效的窗口包括 1.直接启动IE浏 ...

  9. 艾伟_转载:一次挂死(hang)的处理过程及经验

    前言: CPU占用率低,内存还有许多空余,但网站无法响应,这就是网站挂死,通常也叫做hang.这种情况对于我这样既是CEO,又是CTO,还兼职扫地洗碗的个人站长来说根本就是家常便饭.以下是一次处理ha ...

最新文章

  1. Zabbix-2.2.4,显示中文语言的选项方法
  2. MyBatis-05 MyBatis XML方式之update/delete元素
  3. 学写网站(一)前端配置之安装nvm、node、npm
  4. 【CV秋季划】模型算法与落地很重要,如何循序渐进地学习好?
  5. Matlab | 数字信号处理:双线性变换法设计IIR数字滤波器
  6. 【BZOJ】2190 [SDOI2008]仪仗队
  7. size - 列出段节大小和总共大小
  8. 【今日CS 视觉论文速览】Wed, 30 Jan 2019
  9. java rsa padding_rsa加密--选择padding模式需要注意的问题。。。
  10. 2017 Multi-University Training Contest - Team 7:1003. Color the chessboard(...)
  11. python课堂_python课堂整理6---字典
  12. 跃迁 成为高手的技术
  13. Python集合set与frozenset的区别
  14. 数据结构实践——用哈希法组织关键字
  15. mysql学习之三:sql语句学习
  16. 二自由度云台扫描算法_基于二维压电透射式微扫描器的红外超分辨率成像|压电扫描台...
  17. Oracle+ogg-00664,OGG采用NET8方式读取ASM中日志报OGG-00664(ORA-12162),配置如下:
  18. 爬虫基础以及Xpath、Beautiful Soup的应用
  19. Spring Cloud 学习笔记
  20. 应用宝上架审核要求_Android应用商店上架审核要求

热门文章

  1. 大牛激辩:AI 该像婴儿一样生来就懂事,还是该从零学习?
  2. 漫画 | 程序员联名把产品经理告上县衙,并列了 8 大罪状
  3. 想进大厂?Dubbo 普普通通 9 问你知道吗
  4. 用 Heapster 监控集群 - 每天5分钟玩转 Docker 容器技术(176)
  5. vue + element +tp5 个人博客后台管理小记
  6. 深度有趣 | 26 Seq2Seq机器翻译
  7. 高级算法专家储开颜:无端不视频 阿里视频云三大端上技术能力
  8. mysql性能优化学习笔记-存储引擎
  9. 2.1顺序表(链表)
  10. 简单例子解释invalidate(), requestLayout() (常用还是需要知道的)