c# - 为什么创建这些线程不会释放内存?
问题描述
我有这样的代码:
class Engine
{
private static Thread f_thread;
private static System.Timers.Timer timeWatch;
public static void Start()
{
try
{
timeWatch = new System.Timers.Timer(30000);
timeWatch.Elapsed += FolderMonitor;
timeWatch.AutoReset = true;
timeWatch.Enabled = true;
}
catch (Exception ex)
{
// catch error
}
}
public static void FolderMonitor(object source, ElapsedEventArgs e)
{
f_thread = new Thread(FileScan);
f_thread.Start();
}
public static void FileScan()
{
if (timeWatch != null)
{
timeWatch.Stop();
}
try
{
// some operations
}
catch (Exception ex)
{
// catch error
}
timeWatch.Start();
}
}
在远程计算机上运行的 .NET Core 2.2 Windows 服务上。如果我在运行 1 周后检查内存,它会不断增长。
似乎它没有释放线程分配的内存(某种内存泄漏)。
但是,如果我在线程的 FileScan 函数中“什么都不做”,它也会长大(较小,但 id 会)。怎么了?GC不应该自动释放它吗?
解决方案
属于这些对象(即您创建和运行的线程)的静态对象和变量不会在 C# 中被垃圾收集。
对于要进行垃圾回收的线程,它必须属于非静态对象,必须停止并清除所有引用(mythread = null)。
我在使用线程时遇到了同样的问题,用 C# 编写了一个音频流专用服务器。
当我发现泄漏时,我不得不重新思考并重新编写大部分代码。:)
推荐阅读
- mapbox - 从 Mapbox Tilequery API 下载数据
- ngrx - ngrx 实体适配器未更新所需属性的子属性
- python - 带有通配符的 Python LIKE 中的 MySql 查询
- javascript - 使用 javascript 删除包含标签和文本框的动态添加的表单组
- html - Bootstrap 4 .card 溢出时受父高度限制
- r - 分组并保留具有匹配模式的列
- flutter - 如何使用 Flutter 和 Dart 在后台监听 BLE 信号?
- c++ - 当从仿函数类模板参数推导出(衰减)类型时,完美转发失败。为什么?
- scala - Flink Streaming - 每天触发的 10 天事件时间窗口
- c++ - 使用 new[] 关键字时不允许不完整类型