gpt4 book ai didi

.net 4 MemoryCache 泄漏?

转载 作者:行者123 更新时间:2023-12-05 08:02:06 26 4
gpt4 key购买 nike

我将 MemoryCache 与 Sql 依赖项一起使用。我注意到当使用 MemoryCache.Set() 时,如果集合中的某个项目被覆盖,则会发生内存泄漏。考虑以下场景:

  1. key=A 的项被插入到缓存中,并依赖于 Table1
  2. 使用 .Set() 重新插入具有相同 key=a 的新项目,依赖于 Table2
  3. 数据库中的表 2 已更改。

-> Item key=a 确实已从缓存中删除,但其内存仍在 MemoryCache 中。只有当数据库中 Table1 的数据发生变化时,内存才会被释放。

复制代码:

public partial class Form1 : Form
{
const string cs = @"Data Source=.\sqlexpress;Initial Catalog=TestDB;";
public Form1()
{
SqlDependency.Start(cs);
InitializeComponent();
}

MemoryCache memCache = new MemoryCache("test1", new NameValueCollection {
{ "pollingInterval", "00:00:03"}});

private void button2_Click(object sender, EventArgs e)
{
var dep1 = GetDep("SELECT ID FROM dbo.Table1");
var dep2 = GetDep("SELECT ID FROM dbo.Table2");

var policy = new CacheItemPolicy();
policy.SlidingExpiration = new TimeSpan(2, 0, 0);
policy.ChangeMonitors.Add(new SqlChangeMonitor(dep1));

memCache.Set("a", GetSB(), policy);

var policy2 = new CacheItemPolicy();
policy2.SlidingExpiration = new TimeSpan(2, 0, 0);
policy2.ChangeMonitors.Add(new SqlChangeMonitor(dep2));

memCache.Set("a", GetSB(), policy2);
}

private object GetSB()
{
StringBuilder sb = new StringBuilder(100000000);
for (var i = 0; i < sb.Capacity; i++)
{
sb.Append("1");
}
return sb.ToString();
}

private static SqlDependency GetDep(string sql)
{
SqlConnection con = new SqlConnection(cs);
var cmd = new SqlCommand(sql, con);
SqlDependency dep = new SqlDependency(cmd);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
return dep;
}

private void button3_Click(object sender, EventArgs e)
{
GC.Collect();
GC.WaitForPendingFinalizers();
MessageBox.Show("Total Memory Usage = " + GC.GetTotalMemory(true).ToString());
}

private void button1_Click(object sender, EventArgs e)
{
bool exists = memCache.Get("a") != null;
MessageBox.Show("Value exits -> " + exists);
}
}

要使用代码,请点击 Button2 进行初始化,然后更改数据库中 Table2 的数据。使用 Button3 查看可用内存。

最佳答案

大概过了好久才回答。

public override object Remove(string key, string regionName = null);

您应该在插入/替换缓存数据之前删除旧 key 。

关于.net 4 MemoryCache 泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9905128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com