

c#でseleniumを利用しているのですが、下記コードの`var html =
driver.PageSource;`を実行するたびに使用メモリが増えていき、すぐにメモリがいっぱいになってしまいます。  
1時間もすると、利用メモリが4GBに到達し、OutOfMemoryExceptionを発生してしまいます。  
`driver.Quit();`の前に`driver.Close()`を入れてみたり、下記コードはあるクラス内に書いているのですが、そのクラスにnullを入れたあと`GC.Collect()`などを実行したりしてみてるのですが、メモリが全く解放されません。

追記：Selenium.Webdriverのバージョンは3.141.0  
Selenium.WebDriver.Chromedriverのバージョンは84.04147.3001を利用しています。

対象アプリケーションを無理やり再起動させて、などの処理も考えているのですがseleniumで利用したメモリを解放する手段をご存知の方がいれば、教えていただけるとありがたいです。。

[code]

    driver = new ChromeDriver(driverService, options, TimeSpan.FromSeconds(60));
    driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(60);
    driver.Navigate().GoToUrl(this.Url);
    
    ReadOnlyCollection<IWebElement> elements = driver.FindElements(By.XPath(@"//a[@href!='' and normalize-space(.) != '']"));
    var html = driver.PageSource;
    
    elements = null;
    driver.Quit();
    
    // chromedriverのプロセスを破棄する
    KillProcessAndChildren("chromedriver.exe");
    driver = null;
    
    return html;
    
[/code]


CC BY-SA 4.0
2020-08-03T01:37:38.853
69196
2020-10-24T08:03:30.507
2020-08-03T02:46:15.490
37744
37744
question
c# selenium chromedriver
c#でseleniumを利用すると利用メモリがどんどん増えていく


質問するときは環境に関する情報を詳しく記述しましょう。  
OSやIDE、ランタイムや仮想マシンのバージョンの些細な違いが重要であったりするケースもあります。

  * [技術系メーリングリストで質問するときのパターン・ランゲージ](https://www.hyuki.com/writing/techask.html)

`KillProcessAndChildren()`の中では具体的に何をやっているのでしょうか？  
`"chromedriver.exe"`を指定しているということは、おそらくWindows環境なのだと思われますが、そもそもSeleniumはクロスプラットフォームな自動化ソリューションなので、Windows環境前提のコードを無条件で記述している時点で何かがおかしいと考えたほうがよいと思います。もしプロセスを勝手に強制終了しているのだとすれば、そのせいで状態がおかしくなっている可能性があります。

`ChromeDriver`クラスは`ChromiumDriver`派生、`ChromiumDriver`クラスは`RemoteWebDriver`派生、また`RemoteWebDriver`クラスは`IWebDriver`インターフェイスを実装していますが、`IWebDriver.Quit()`ではドライバーの終了とすべての関連ウィンドウのクローズを実行する仕様らしいので、おそらく本来は`Quit()`メソッドを呼び出すだけでよいはずです。  
また、途中で例外が発生しても`Quit()`メソッドが必ず呼ばれるように、`try-
finally`文を利用するべきです。現状、`RemoteWebDriver.Quit()`の内部では単純に`IDisposable.Dispose()`メソッドを呼び出しているだけなので、`using`文を使うという手もありますが、今後も`using`文だけでよいかどうかは`RemoteWebDriver`の実装に依存します。

  * [IWebDriver Interface](https://www.selenium.dev/selenium/docs/api/dotnet/html/T_OpenQA_Selenium_IWebDriver.htm)
  * <https://github.com/SeleniumHQ/selenium/blob/trunk/dotnet/src/webdriver/Chrome/ChromeDriver.cs>
  * <https://github.com/SeleniumHQ/selenium/blob/trunk/dotnet/src/webdriver/Chromium/ChromiumDriver.cs>
  * <https://github.com/SeleniumHQ/selenium/blob/trunk/dotnet/src/webdriver/Remote/RemoteWebDriver.cs>
  * [using ステートメント - C# リファレンス | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/using-statement)

`PageSource`のHTML文字列をDBに保存している、というのも気になります。そのDBがエントリをメモリにマッピングしたままの状態（いわゆる非意図的オブジェクト保持）になっていればメモリリークします。本当にメモリ使用量の問題がSeleniumに起因するものなのかどうかを見極めるため、対照実験の観点から、DB保存をしなかった場合にどうなるか、ということも試したほうがよいと思います。


CC BY-SA 4.0
2020-08-12T21:40:43.070
69503
2020-08-12T21:46:11.177
2020-08-12T21:46:11.177
15413
15413
69196
answer