我正在寻求帮助,因为我注意到 c# 中的 selenium chromeDriver 没有正确释放内存。我一直在使用 RamMap 来跟踪内存使用情况。当不运行以下脚本时,内存使用量不会稳定增加。
在任务计划程序中运行以下脚本会导致 RamMap 的“Unused-Active”条目中的内存在每次运行时增加。我已确认资源监视器、任务管理器或 RamMap 中没有活动的 chromedriver 或 chrome 进程。 Selenium.WebDriver v4.23.0。 Chrome 和 ChromeDriver v127。
RamMap 的屏幕截图供参考,可以看到“Unused-Active”条目在运行脚本约 5 分钟后显着上升。当脚本不运行时,该值不会上升。
15 个计划任务每分钟启动控制台应用程序,持续 5 分钟 - 价值显着增加
我尝试过的可重现代码:(创建 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
}
}
}
除非这会导致性能问题,否则我不确定您是否有问题需要解决。 .NET Framework 不会仅仅因为垃圾收集器运行而释放内存。运行时将保留分配的内存,因此操作系统仍会看到该内存正在使用(尽管它可能被视为不活动)。仅当系统耗尽未使用的内存时,.NET 运行时才会开始放弃其未使用的内存。如果我没记错的话,这是预期的行为。
一些额外资源:
说实话,你在屏幕截图中突出显示的数字看起来并没有那么不同,除非我遗漏了一些东西......