1

Chrome ブラウザを生成して強制終了するアプリケーションを作成しています。プログラムでプロセスを強制終了している間 (Windows タスク マネージャーを介してプロセスを強制終了するのと同じ効果)、これにより、元のプロセスと適切に関連付けられていないカーネル リソースなどの要素から、メモリ リークが発生する可能性があることが示唆されています。 .

プロセスが強制終了された後、アプリケーションがメモリをリークしたり、要求できないメモリを持ったりする可能性はありますか?

4

4 に答える 4

2

これ発生する可能性がありますが、発生した場合、プログラムのバグになることはありません。これは常に、Windowsカーネルコードまたは一部のカーネルドライバのバグ/エラーが原因で発生します。また、Windowsの標準インストールでこのような動作が発生する可能性はほとんどありません。

于 2012-05-02T22:09:23.477 に答える
1

プログラムが複数のプロセスを開始する場合があります。親プロセスを強制終了しても、それ自体が子プロセスが終了することを保証するものではありません。これはメモリリークのように見える可能性があります。オペレーティングシステムに関する限り、割り当てられたすべてのメモリは実行中のプロセスに関連付けられたままです。これらのすべてのプロセスがまだ実行されているとは限らない場合があります。

Chromeに関する限り、多くの子プロセスを生成します。親プロセスが予期せず終了した場合でも、確実にクリーンアップできると思いますが、確信が持てませんでした。

于 2012-05-02T22:20:53.893 に答える
1

タスク マネージャーでプロセスを直接強制終了すると、メモリ リークが発生する可能性があります。「explorer.exe」を殺し続けると、OS全体が遅くなるという証拠があります。

各 Chrome ウィンドウには、アクティブなタブごとに GUI プロセスとバックグラウンド プロセスがあります。バックグラウンド プロセスは、ページ コンテンツの取得、リクエストの送信/データの投稿を担当し、GUI プロセスよりも少ないカーネル オブジェクト ハンドルを保持します。どのプログラミング フレームワークにも、アクティブなプロセスを閉じるためのメソッドが少なくとも 2 つあります。たとえば、.NET では、Process クラスには次の 2 つのメソッドがあります。

  1. CloseMainWindow()
    • メイン ウィンドウのメッセージ ループに WM_QUIT メッセージを送信して、プロセスを閉じるように要求します。これにより、プログラムは子ウィンドウとカーネル オブジェクトを再度呼び出すことができます。
  2. 殺す()
    • タスク マネージャーでプロセスを強制終了するのと同じように、プロセスを強制的に終了させます。これは、バックグラウンド プロセスを閉じる唯一の方法です。ただし、これが GUI プロセスに適用される場合、これはすべての GUI/カーネル イベントをトリガーしてリソースを解放するわけではありません。カーネル オブジェクトには、GDI オブジェクト、ファイル/プリンター ハンドル、データベース/ネットワーク接続コンテキストなどが含まれます。これらのリソースを解放するには、メモリ リンク リスト/マップ全体を追跡してカーネル オブジェクトのリソースの割り当てを解除するため、時間がかかります。.NET/Java にはガベージ コレクターがあり、「管理された」メモリを確実に解放しますが、カーネル オブジェクトの管理されていないリソースが常にカバーされるとは限りません。

以下は、.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();
}
于 2012-05-05T22:49:49.600 に答える
0

プログラムがクリップボードに大量のメモリを配置すると、メモリ リークのように見えるかもしれませんが、クリップボードは依然としてメモリを管理しており、他の何かが何か新しいものをコピーすると解放されます。

これは、プログラムの寿命を超えるメモリについて私が考えることができる唯一のケースです。

于 2012-05-02T22:14:03.767 に答える