Informix 内存泄漏

Posted

技术标签:

【中文标题】Informix 内存泄漏【英文标题】:Informix memory leak 【发布时间】:2016-06-02 16:47:57 【问题描述】:

我在使用 Informix 时遇到了一个奇怪的问题(具体来说,我使用的是 IBM.Data.Informix 命名空间,4.10 Client SDK)。我正在使用 ODBC 连接到 IBM Informix 数据库并遇到内存泄漏问题。文档相当稀少,我只能使用我目前安装的驱动程序/SDK。这是我用于数据库上下文的代码:

public class IfxDbContext : IIfxDbContext

    private readonly string _connectionString;
    //private readonly IfxConnection _connection;

    public IfxDbContext(string connectionString)
    
        _connectionString = connectionString;
        //IfxConnection conn = new IfxConnection(connectionString) ConnectionString = connectionString;

        //_connection = conn;
    

    public IEnumerable<Item> GetItems()
    
        var items = new List<Item>();

        try
        
            using (IfxConnection conn = new IfxConnection(_connectionString))
            
                conn.Open();

                using (IfxCommand cmd = conn.CreateCommand())
                
                    cmd.CommandText = "VALID SQL COMMAND";

                    IfxDataReader dr = cmd.ExecuteReader();

                    while (dr.Read())
                    
                        //add to items
                    
                
            
        
        catch(IfxException ex)
        

        

        return items;
    

我已经尝试处理和关闭任何我可以的连接,但这似乎没有帮助。我错过了什么还是驱动程序有问题?那么问题就变成了,我可以做些什么来逐步释放内存?该应用程序达到约 1200 MB 并崩溃。

我的特定错误是“没有足够的空间用于解析器堆栈”和“内存分配失败”。

我错过了什么吗?

【问题讨论】:

当你写下你正在处理和关闭任何连接时,你是否也在处理/关闭所有其他对象:IfxCommand、IfxDataReader 等? @LuísMarques 是的,我关闭并处置了我能做的一切。仔细研究一下,这可能是温莎城堡的问题。这是我目前的想法,我正在研究它。 获取内存分析器,看看哪些对象没有被释放,为什么,不要猜测 我在使用相同版本的 SDK 时遇到了同样的问题。这让我发疯了。 【参考方案1】:

原来这是我用于项目的特定版本的 SDK(4.10 - 32 位)的问题。除非您无限期地打开连接和命令,否则应用程序将泄漏内存。这并不是一个真正的解决方案,因为连接的数量是有限的,并且如果我有多个与应用程序的连接,它很快就会用完。因为我需要继续使用这个特定的 SDK 版本,所以我将 IIS 配置为在达到内存阈值(在我的实例中为 1 GB)时回收应用程序池。这暂时解决了这个问题,尽管它无法解决 SDK 的根本问题。

【讨论】:

我无法告诉你过去几天这让我有多疯狂。您是否找到任何其他解决方案,因为我无法打开连接。我每 10 秒就有一次 Ajax 查询。但是,如果我可以通过其他方式连接,我不会被锁定使用 SDK, @Tsukasa 我无法找到解决此问题的任何其他解决方案或任何其他连接数据库的方法。您是否无法经常回收 IIS 应用程序池?到目前为止,该解决方案对我来说效果很好,没有中断服务。我每隔几秒钟就到达终点一次,没有问题。 我已经重写了我的类,并使用 ODBC 制作了一个。我将同时测试两者,看看 ram 会发生什么。我面前没有 ram 快照,但如果我没记错的话,它与 CNativeBuffer 有关。现在我不确定内部发生了什么,但我在 Dispose 中看到了很多 Marshaling 和 GC.KeepAlive 调用。

以上是关于Informix 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

MFC内存泄漏调试

如何防止java中的内存泄漏

记录一次DialogFragment 内存泄漏

常见的内存泄漏原因及解决方法

Android ValueAnimator --内存泄漏

Android内存泄漏查找和解决