C#中Selenium ChromeDriver内存泄漏问题求助
C#环境下Selenium ChromeDriver内存未正常释放问题求助
我在C#环境中使用Selenium ChromeDriver时遇到内存无法正常释放的问题,特寻求技术帮助。通过RamMap工具监测内存使用情况发现:不运行相关脚本时,内存不会持续增长;但通过任务计划程序运行脚本后,RamMap中的「Unused-Active」条目内存每次运行都会增加。
已确认资源监视器、任务管理器及RamMap中均无活跃的chromedriver或Chrome进程,当前使用版本信息:
- Selenium.WebDriver v4.23.0
- Chrome及ChromeDriver v127
RamMap截图显示,运行脚本约5分钟后「Unused-Active」条目内存显著上升,不运行脚本时该数值无增长。该数值在5分钟内从7000KB升至50000KB;按此趋势,24小时将增加近12384000KB(约12GB),运行一周后机器内存占用率将超过80%,均为未使用但仍标记为「Active」的内存,已引发严重性能问题。
各阶段RamMap监测截图
- 脚本运行前(重启后):数值无增长

- 10分钟停机(无脚本运行)

- 15个计划任务每分钟启动一次控制台应用,持续5分钟:数值显著上升

- 10分钟停机(停止运行脚本)

已尝试的可复现代码
以下代码均为C#控制台应用,通过任务计划程序配置为每分钟运行一次,共15次:
示例1:使用using语句+Close+Quit
using OpenQA.Selenium.Chrome; namespace ChromeBotTest { public class Program { private static async Task Main(string[] args) { using (ChromeDriver? chromeDriver = new()) //using语句自动释放资源 { await Task.Delay(3000); //等待Chrome启动 chromeDriver.Close(); //关闭所有窗口 chromeDriver.Quit(); //完全退出浏览器并释放资源 } } } }
示例2:使用using语句+Quit
using OpenQA.Selenium.Chrome; namespace ChromeBotTest { public class Program { private static async Task Main(string[] args) { using (ChromeDriver? chromeDriver = new()) //using语句自动释放资源 { await Task.Delay(3000); //等待Chrome启动 chromeDriver.Quit(); //完全退出浏览器并释放资源 } } } }
示例3:不使用using语句+Quit
using OpenQA.Selenium.Chrome; namespace ChromeBotTest { public class Program { private static async Task Main(string[] args) { ChromeDriver chromeDriver = new(); await Task.Delay(3000); //等待Chrome启动 chromeDriver.Quit(); //完全退出浏览器并释放资源 } } }
示例4:手动Dispose+置空实例
using OpenQA.Selenium.Chrome; namespace ChromeBotTest { public class Program { private static async Task Main(string[] args) { ChromeDriver? chromeDriver = new(); await Task.Delay(3000); //等待Chrome启动 chromeDriver.Close(); //关闭所有窗口 chromeDriver.Quit(); //完全退出浏览器并释放资源 chromeDriver?.Dispose(); //手动释放资源(防止未自动释放) chromeDriver = null; //置空实例确保清理 } } }
示例5:手动触发垃圾回收
using OpenQA.Selenium.Chrome; namespace ChromeBotTest { public class Program { private static async Task Main(string[] args) { ChromeDriver? chromeDriver = new(); await Task.Delay(3000); //等待Chrome启动 chromeDriver.Close(); //关闭所有窗口 chromeDriver.Quit(); //完全退出浏览器并释放资源 chromeDriver?.Dispose(); //手动释放资源(防止未自动释放) chromeDriver = null; //置空实例确保清理 await Task.Delay(2000); //延迟2秒 GC.Collect(); GC.WaitForPendingFinalizers(); //等待终结器执行 GC.Collect(); await Task.Delay(10000); //等待10秒确保垃圾回收完成 } } }
内容的提问来源于stack exchange,提问作者freyfrey01
相关产品推荐
相关产品推荐

