プライベートメンバーとしてConcurrentDictionaryを持つクラスがあります。このクラスは、デリゲート/コールバックメソッドも定義します。基本クラスは、このメソッドを外部イベントのコールバックとして登録します。これは一度だけです。
ANTメモリプロファイラーを実行していますが、ConcurrentDictionaryプロパティの数百のインスタンスから参照されるMyObjの数千のインスタンスが表示されています。これらのGCルートはイベントコールバックです。
これにより、アプリケーションの実行中にメモリが大幅に増加しているようです。おそらく約5分後、そのメモリのかなりの部分が再利用されますが、アプリはすぐに膨らむため、問題が発生する可能性があるのではないかと心配しています。そしてGCが始まる前の長い間。
ここで何が起こっているのですか、どうすれば解決できますか?
これは、ハンドラーを登録する基本呼び出しのスニペットです
protected abstract void DataReceivedEventHandler(DataChangedEvent evt);
public virtual void RegisterForChanges(ICollection<MemoryTable> tables)
{
foreach (MemoryTable table in tables)
{
_subscribedTables.Add(table);
table.RegisterEventListener(new DataChangedCallBack(this.DataReceivedEventHandler));
}
}
上記の基本クラスのサブクラスに実装されているハンドラーは次のとおりです。
private ConcurrentDictionary<string, DataRecord> _cachedRecords;
protected override void DataReceivedEventHandler(DataChangedEvent evt)
{
DataRecord record = evt.Record as DataRecord;
string key = record.Key;
if (string.IsNullOrEmpty(key)) { return; }
if (_cachedRecords.ContainsKey(key))
{
_cachedRecords[key] = record;
DateTime updateTime = record.UpdateTime;
TimeSpan delta = updateTime - _lastNotifyTime;
if (delta.TotalMilliseconds > _notificationFrequency)
{
PublishData(updateTime);
}
}
}
publishDataメソッドはプリズムイベントを公開します