Chrome ブラウザを生成して強制終了するアプリケーションを作成しています。プログラムでプロセスを強制終了している間 (Windows タスク マネージャーを介してプロセスを強制終了するのと同じ効果)、これにより、元のプロセスと適切に関連付けられていないカーネル リソースなどの要素から、メモリ リークが発生する可能性があることが示唆されています。 .
プロセスが強制終了された後、アプリケーションがメモリをリークしたり、要求できないメモリを持ったりする可能性はありますか?
Chrome ブラウザを生成して強制終了するアプリケーションを作成しています。プログラムでプロセスを強制終了している間 (Windows タスク マネージャーを介してプロセスを強制終了するのと同じ効果)、これにより、元のプロセスと適切に関連付けられていないカーネル リソースなどの要素から、メモリ リークが発生する可能性があることが示唆されています。 .
プロセスが強制終了された後、アプリケーションがメモリをリークしたり、要求できないメモリを持ったりする可能性はありますか?
これは発生する可能性がありますが、発生した場合、プログラムのバグになることはありません。これは常に、Windowsカーネルコードまたは一部のカーネルドライバのバグ/エラーが原因で発生します。また、Windowsの標準インストールでこのような動作が発生する可能性はほとんどありません。
プログラムが複数のプロセスを開始する場合があります。親プロセスを強制終了しても、それ自体が子プロセスが終了することを保証するものではありません。これはメモリリークのように見える可能性があります。オペレーティングシステムに関する限り、割り当てられたすべてのメモリは実行中のプロセスに関連付けられたままです。これらのすべてのプロセスがまだ実行されているとは限らない場合があります。
Chromeに関する限り、多くの子プロセスを生成します。親プロセスが予期せず終了した場合でも、確実にクリーンアップできると思いますが、確信が持てませんでした。
タスク マネージャーでプロセスを直接強制終了すると、メモリ リークが発生する可能性があります。「explorer.exe」を殺し続けると、OS全体が遅くなるという証拠があります。
各 Chrome ウィンドウには、アクティブなタブごとに GUI プロセスとバックグラウンド プロセスがあります。バックグラウンド プロセスは、ページ コンテンツの取得、リクエストの送信/データの投稿を担当し、GUI プロセスよりも少ないカーネル オブジェクト ハンドルを保持します。どのプログラミング フレームワークにも、アクティブなプロセスを閉じるためのメソッドが少なくとも 2 つあります。たとえば、.NET では、Process クラスには次の 2 つのメソッドがあります。
以下は、.NET C# のテスト アプリです。Visual Studio アドオンの Memory Profiler を使用して、CloseMainWindow() と Kill() を比較できます。ほとんどの場合、Kill() の方が高速ですが、リアルタイム メモリ グラフで「ルート参照」と「インスタンス参照」をチェックすることで解放されるメモリは少なくなります。
private Process _chromeProcess = new Process();
private void bntCreate_Click(object sender, EventArgs e)
{
string chromePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
@"Google\Chrome\Application\chrome.exe");
_chromeProcess.StartInfo = new ProcessStartInfo(chromePath, @"-app=http://localhost:(a local Web site)");
_chromeProcess.Start();
}
private void btnKill_Click(object sender, EventArgs e)
{
_chromeProcess.Kill();
_chromeProcess.WaitForExit();
_chromeProcess.Close();
}
private void btnClose_Click(object sender, EventArgs e)
{
_chromeProcess.CloseMainWindow();
_chromeProcess.WaitForExit();
_chromeProcess.Close();
}
プログラムがクリップボードに大量のメモリを配置すると、メモリ リークのように見えるかもしれませんが、クリップボードは依然としてメモリを管理しており、他の何かが何か新しいものをコピーすると解放されます。
これは、プログラムの寿命を超えるメモリについて私が考えることができる唯一のケースです。