内存泄漏问题,私有数据正在增加.Net Framework 4

Posted

技术标签:

【中文标题】内存泄漏问题,私有数据正在增加.Net Framework 4【英文标题】:Memory leak issue, private data is increasing .Net Framework 4 【发布时间】:2014-03-02 11:51:05 【问题描述】:

在生产 Windows 服务中,我的应用程序出现内存泄漏。

Service OnStart 事件:这就是我的服务启动的方式。我怀疑是因为事件。该服务所做的只是,它从第三方库订阅几个事件,并在事件发生时执行这些事件。

在此代码中,Aggregator 被定义为类属性

public EventAggregator Aggregator get; set;

Task.Factory
.StartNew(ConnectionManager.AttemptXXXXXXConnection)
                .ContinueWith(task => Aggregator.StartAggregatePublishing(), TaskContinuationOptions.OnlyOnRanToCompletion)
                .ContinueWith(task =>
                                  
                                      if (task.Exception == null) return;
                                      Logger.Log("Failed to start Events aggregation due to:");

                                      foreach (var exception in task.Exception.InnerExceptions)
                                          Logger.Log(exception.Message);

                                  , TaskContinuationOptions.OnlyOnFaulted );

StartAggregatePublishing方法定义如下

public IEventHandler<ISystemEvent3> SystemEventHandler

   get; set;


public IEventHandler<DeviceEvents2EventArgs> DeviceEventHandler

     get; set;

这里的systemEventsManagementdeviceEventManagement 属于第三方库事件,因此我们可以提供自己的实现。

public void StartAggregatePublishing()

        Logger.Log("Start event publishing");
        XXXData.Events.SystemEvent += SystemEventHandler.HandleEvent;
        XXXdata.Events.DeviceEvent += DeviceEventHandler.HandleEvent;

        systemEventsManagement.Events       += systemEventsManagement_Events;
        deviceEventsManagement.Event        += deviceEventsManagement_Event;
        processor.Start();
        Logger.Log("System and Device events aggregation started.");

现在游戏从EventAggregator开始

public EventAggregator( int sleepMills = 1000)

        processor = new ThreadPausableProcessor( CheckDeviceStates, HandleException, sleepMills );

每分钟运行的方法是这样的

private void CheckDeviceStates()

    if ( Device.IsConnected )
    
            foreach (var deviceState in Skidata.Events.GetAllDeviceStates())
            
                Logger.Log(string.Format("Checking Handlers for Device id = 0 with Overall state = 1", deviceState.DeviceId, deviceState.OverallState));

 // Here I am handling pertucular event and logging and reporting stuff.. Nothing major
                DeviceStateHandler.HandleEvent(deviceState);
            
  // Once I handled all the events I am unhooking all the events and disposing everything.
            Dispose(true);

            int mills;
            ConfigurationManager.RefreshSection("appSettings");
            if ( Int32.TryParse( ConfigurationManager.AppSettings["PollFrequencyInMills"], out mills ) )
            
                if ( processor.SleepMills != mills )
                
                    processor.SleepMills = mills;
                    Logger.Log(string.Format("New polling frequency for DeviceStates processor thread = 0 mills", mills));
                
            
    
    else
    
        Logger.Log("CheckDeviceStates => Not connected to facility.");
    

我在这里缺少什么我不知道我希望我提供了足够的细节。

这是由以前的程序员代替我编写的代码,现在该代码正在生产中。 任何人都可以知道它到底在哪里可能出错。

我使用了 DotTrace 内存分析器并有几个快照,但我找不到问题,一切对我来说都很好。如果需要,我可以提供这些快照。

服务重新启动时私有字节数:31,383,552

运行私有字节三天后:65,584,648

【问题讨论】:

【参考方案1】:

你试过Redgate ANTS Memory Profiler吗? 它可以可视化对象之间的关系并显示大多数需要内存的对象

【讨论】:

感谢您的回复。不,我没试过。

以上是关于内存泄漏问题,私有数据正在增加.Net Framework 4的主要内容,如果未能解决你的问题,请参考以下文章

GAE - Nodejs - 一个简单的 pubsub 应用程序的内存泄漏 - 超过了软私有内存限制

使用ffmpeg解码 需要注意的内存泄漏问题

使用动态内存从转发列表中泄漏内存

循环引用导致内存泄漏?

Activemq 主题订阅者堆内存泄漏 - 为啥消息在增加?

使用 Jquery 自动完成时的 IE11 内存泄漏 (asp.net)