首页 > 解决方案 > 为什么创建这些线程不会释放内存?

问题描述

我有这样的代码:

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#multithreadingasp.net-corememory-leaksgarbage-collection

解决方案


属于这些对象(即您创建和运行的线程)的静态对象和变量不会在 C# 中被垃圾收集。

对于要进行垃圾回收的线程,它必须属于非静态对象,必须停止并清除所有引用(mythread = null)。

我在使用线程时遇到了同样的问题,用 C# 编写了一个音频流专用服务器。

当我发现泄漏时,我不得不重新思考并重新编写大部分代码。:)


推荐阅读