.NET JIT代码缓存泄漏?

14

我们有一个用 .Net 3.5 写的服务器组件。它作为服务在 Windows Server 2008 Standard Edition 上运行。它的性能非常好,但是经过一段时间(几天)后,我们注意到系统变得非常缓慢,工作集也增加了。我们认为可能是内存泄漏问题,并使用 WinDBG/SOS 分析该进程的转储文件。不幸的是,GC 堆并没有显示出任何泄漏,但我们注意到 JIT 代码堆从启动后的8MB增长到几天后的1GB以上。

我们没有使用自己的任何动态代码生成技术。我们使用 Linq2SQL,这是一个以动态代码生成而闻名的框架,但我们不知道它是否会引起这样的问题。

主要问题是是否有任何技术可以分析转储文件并检查在 WinDBG 转储中显示的所有这些 Host Code Heap 块来自哪里?

[更新]

在此期间,我们进行了更多的分析,将 Linq2SQL 视为可能的问题,特别是我们没有使用预编译查询。以下示例程序创建了完全相同的行为,随着时间推移越来越多的 Host Code Heap 块被创建。

using System;
using System.Linq;
using System.Threading;

namespace LinqStressTest
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 100; ++ i)
                ThreadPool.QueueUserWorkItem(Worker);
            while(runs < 1000000)            
            {
                Thread.Sleep(5000);
            }
        }

        static void Worker(object state)
        {
            for (int i = 0; i < 50; ++i)
            {
                using (var ctx = new DataClasses1DataContext())
                {
                    long id = rnd.Next();
                    var x = ctx.AccountNucleusInfos.Where(an => an.Account.SimPlayers.First().Id == id).SingleOrDefault();
                }
            }
            var localruns = Interlocked.Add(ref runs, 1);
            System.Console.WriteLine("Action: " + localruns);
            ThreadPool.QueueUserWorkItem(Worker);
        }

        static Random rnd = new Random();
        static long runs = 0;
    }
}

当我们使用预编译的 Linq 查询替换原来的查询时,问题似乎消失了。


@pitchfork - 有点随意的想法。 你尝试过关闭DataContext中的更改跟踪吗? ctx.ObjectTrackingEnabled = false作为using语句内的第一行代码? - Mike Two
2个回答

1

在循环中,使用“单例”DataContext,而不是每次重新创建它。

我相信效果与编译查询相同。

更新:

这个问题在.NET 4中被“纠正”,因为它支持可垃圾回收的动态程序集。


0

我所知道的.NET中内存泄漏的唯一方式是由于事件处理,可以看看这个:

  1. link1
  2. 另外,看看以下问题:How do I avoid a memory leak with LINQ-To-SQL?
  3. 还要看看ANTS分析器
  4. 而且,你有没有考虑过,也许在某个时刻会有很多线程运行?这将自然地消耗大量内存?

感谢这些技巧。使用WinDBG,我们能够证明我们没有在托管堆中泄漏内存,而且我们总是在工作单元完成后放弃我们的DataContext。 - user173674

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接