知识大全 DataTable.NewRow 内存泄漏问题

Posted

篇首语:行是知之始,知是行之成。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 DataTable.NewRow 内存泄漏问题相关的知识,希望对你有一定的参考价值。

DataTable.NewRow 内存泄漏问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  先看一下有问题的代码

  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 o ways to get rid of the DataRow:

  Add it to the table then delete it

  Call DataTable Clear()

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

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

   调用 DataTable Clear() 方法释放

  由于我这个应用中数据表只存放架构信息 始终是空表 所有我采用了第 种方法 加入 _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;

  

  

cha138/Article/program/net/201311/13387

相关参考

知识大全 Java 程序里的内存泄漏

Java程序里的内存泄漏  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java程序里的内存泄漏

知识大全 Java内存泄漏分析与解决方案

Java内存泄漏分析与解决方案  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java内存泄漏是

知识大全 未释放事件Handler可能导致内存泄漏

未释放事件Handler可能导致内存泄漏  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  以前曾看

知识大全 java内存泄漏的定位与分析

  ArrayList就是传说中的动态数组就是Array的复杂版本它提供了如下一些好处动态的增加和减少元素灵活的设置数组的大小……  认真阅读本文我相信一定会对你有帮助比如为什么ArrayList里面

知识大全 发现Java虚拟机内存泄露问题

发现Java虚拟机内存泄露问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!内存泄露问题对于程序来

知识大全 Java人员谈论内存泄露问题分析

Java人员谈论内存泄露问题分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  很多人在谈论内存

知识大全 关于PHP内存溢出问题的解决方法

关于PHP内存溢出问题的解决方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一.内存溢出解决

知识大全 关于MSSQL占用过多内存的问题

关于MSSQL占用过多内存的问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  经常看见有人问M

知识大全 巧解Tomcat中JVM内存溢出问题

巧解Tomcat中JVM内存溢出问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  你对Tomc

知识大全 设置Java虚拟机(JVM)的内存问题

设置Java虚拟机(JVM)的内存问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &