内存泄漏问题,私有数据正在增加.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;
这里的systemEventsManagement
和deviceEventManagement
属于第三方库事件,因此我们可以提供自己的实现。
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 应用程序的内存泄漏 - 超过了软私有内存限制