c# - 为什么垃圾收集器不释放内存
问题描述
我有一个添加类型“IJornalEnrty”元素的列表。并且有一个任务是慢慢读取列表。由于列表是共享资源,因此通过锁访问它。列表项必须写入数据库表,并且为了不长时间阻塞,复制内存并将该项从列表中删除。由于读取列表的任务,内存不断增长,即使列表完全为空,内存也不会被清除。
public interface IJornalEnrty
{
string device { get; set; }
string action { get; set; }
string date { get; set; }
IJornalEnrty Clone();
}
public struct JornalEnrty : IJornalEnrty
{
public string device { get; set; }
public string action { get; set; }
public string date { get; set; }
public JornalEnrty(params string[] p)
{
device = p[0];
action = p[1];
date = p[2];
}
public IJornalEnrty Clone ()
{
return new JornalEnrty(String.Copy(device), String.Copy(action), String.Copy(date));
}
}
static async void InsertEntryAsync(object o)
{
CancellationToken cancel = (CancellationToken)o;
string sql = "";
while (!cancel.IsCancellationRequested)
{
IJornalEnrty entry = null;
await GetEntryListLoker.WaitAsync();
entry = EntryList[0]?.Clone();
EntryList.RemoveAt(0);
GetEntryListLoker.Release();
await SaveEntry(entry);
}
}
解决方案
因为 GC 只在需要的时候运行,并且存在内存压力。时期。您的调试器应该有一个内存配置文件视图,显示每个 GC 层何时收集,您可能会看到它根本不需要运行。
推荐阅读
- javascript - node.js SyntaxError: Unexpected token { 在版本 v0.10.43
- python - Python集合模块中大写的意义?
- excel - VBA将工作表从一个工作簿复制到另一个文件夹中的所有工作簿
- python - 如何在python中从用户那里获取多行字符串输入,而不破坏输入
- apache-zookeeper - 使用 zkCleanup.sh 脚本清理旧快照时是否需要停止 zookeeper?
- html - 如何使用 CSS 定位另一个 div 之外的 div 并为其设置样式
- mysql - 为整行创建唯一索引
- google-bigquery - 如何将数据集上传到谷歌云平台?如何处理数据类型?
- java - 如何忽略图像和其他不必要的文件以降低 Jsoup 中的响应时间
- firebase-authentication - Firebase 动态链接在无密码身份验证期间无法启动 iOS 应用程序