C# Selenium ChromeDriver 内存泄漏

问题描述 投票:0回答:1

我正在寻求帮助,因为我注意到 c# 中的 selenium chromeDriver 没有正确释放内存。我一直在使用 RamMap 来跟踪内存使用情况。当不运行以下脚本时,内存使用量不会稳定增加。

在任务计划程序中运行以下脚本会导致 RamMap 的“Unused-Active”条目中的内存在每次运行时增加。我已确认资源监视器、任务管理器或 RamMap 中没有活动的 chromedriver 或 chrome 进程。 Selenium.WebDriver v4.23.0。 Chrome 和 ChromeDriver v127。

RamMap 的屏幕截图供参考,可以看到“Unused-Active”条目在运行脚本约 5 分钟后显着上升。当脚本不运行时,该值不会上升。

运行脚本之前(重新启动后)-值不会增加: Before running scripts

10 分钟的停机时间 - 没有脚本运行 10 minutes of downtime

15 个计划任务每分钟启动控制台应用程序,持续 5 分钟 - 价值显着增加 15 scheduled tasks for 5 minutes on 1 minute intervals

10 分钟的停机时间 - 停止脚本运行 10 minutes of downtime

我尝试过的可重现代码:(创建 C# 控制台应用程序并将项目配置为每分钟通过任务计划程序中的 15 个计划任务运行。)

using OpenQA.Selenium.Chrome;
namespace ChromeBotTest
{
    public class Program
    {
        private static async Task Main(string[] args)
        {
            using (ChromeDriver? chromeDriver = new()) //using statement for automatic disposal
            {
                await Task.Delay(3000); //allow chrome to open for some short time
                chromeDriver.Close(); //close all windows
                chromeDriver.Quit(); //quit to fully close browser and release resources
            }
        }
    }
}
using OpenQA.Selenium.Chrome;
namespace ChromeBotTest
{
    public class Program
    {
        private static async Task Main(string[] args)
        {
            using (ChromeDriver? chromeDriver = new()) //using statement for automatic disposal
            {
                await Task.Delay(3000); //allow chrome to open for some short time
                chromeDriver.Quit(); //quit to fully close browser and release resources
            }
        }
    }
}
using OpenQA.Selenium.Chrome;
namespace ChromeBotTest
{
    public class Program
    {
        private static async Task Main(string[] args)
        {
            ChromeDriver? chromeDriver = new();
            await Task.Delay(3000); //allow chrome to open for some short time
            chromeDriver.Close(); //close all windows
            chromeDriver.Quit(); //quit to fully close browser and release resources
            chromeDriver?.Dispose(); //dispose incase chromeDriver is not properly disposed
            chromeDriver = null; //set to null to ensure its cleared
        }
    }
}
    using OpenQA.Selenium.Chrome;
    namespace ChromeBotTest
    {
        public class Program
        {
            private static async Task Main(string[] args)
            {
                ChromeDriver? chromeDriver = new();
                await Task.Delay(3000); //allow chrome to open for some short time
                chromeDriver.Close(); //close all windows
                chromeDriver.Quit(); //quit to fully close browser and release resources
                chromeDriver?.Dispose(); //dispose incase chromeDriver is not properly disposed
                chromeDriver = null; //set to null to ensure its cleared
                await Task.Delay(2000); //allow 2 second delay
                GC.Collect();
                GC.WaitForPendingFinalizers(); //clean up garabage collection
                GC.Collect();
                await Task.Delay(10000); //wait 10 seconds to allow garbage collection sufficent time to execute
            }
        }
    }
c# selenium-webdriver selenium-chromedriver .net-8.0
1个回答
0
投票

除非这会导致性能问题,否则我不确定您是否有问题需要解决。 .NET Framework 不会仅仅因为垃圾收集器运行而释放内存。运行时将保留分配的内存,因此操作系统仍会看到该内存正在使用(尽管它可能被视为不活动)。仅当系统耗尽未使用的内存时,.NET 运行时才会开始放弃其未使用的内存。如果我没记错的话,这是预期的行为。

一些额外资源:

说实话,你在屏幕截图中突出显示的数字看起来并没有那么不同,除非我遗漏了一些东西......

© www.soinside.com 2019 - 2024. All rights reserved.