24時間実行してから再起動するプログラムがあります。
潜在的なメモリリークを完全に排除するために、 main()を24時間ごとに破棄および更新される別のアプリケーションドメインにシフトするにはどうすればよいですか?
24時間実行してから再起動するプログラムがあります。
潜在的なメモリリークを完全に排除するために、 main()を24時間ごとに破棄および更新される別のアプリケーションドメインにシフトするにはどうすればよいですか?
あなたが言うまであなたは私をすぐに持っていました:
潜在的なメモリリークを完全に排除するために?
別のアプリドメインでコードを実行する場合は、これを実行する方法に関するリソースがたくさんあります。たとえば、別のアプリケーションドメイン(C#およびVisual Basic)でコードを実行するなどです。基本的な原則は、から継承するクラスを作成することMarshalByRefObject
です。次に、新しいアプリドメインを作成し、そのオブジェクトのインスタンスを作成するように指示します。このオブジェクトは、アプリドメインへの「エントリポイント」になります。
AppDomain newAppDomain = AppDomain.CreateDomain("NewApplicationDomain");
ProxyObject proxy = (ProxyObject)newAppDomain.CreateInstanceAndUnwrap("MyAssembly", "MyNamespace.MyProxy");
ただし、C#では、「メモリリーク」のようなものは実際にはありません。せいぜい、不注意にスコープ内に保持されているオブジェクトがあるだけです。この場合、アプリドメインはやり過ぎです。本当に必要なのは、不要になった管理対象オブジェクトへの参照を削除することだけです。ガベージコレクターがそれらを整理します。
アンマネージコードで真のメモリリークが発生した場合、アプリドメインも役に立ちません。アンマネージドタイプはアプリドメインに制限されないため、アプリドメインが破棄されても、アプリドメインの「内部」に割り当てられたアンマネージドメモリは解放されません。この場合、代わりに個別のプロセスを使用することをお勧めします。
別のアプリケーション ドメインでコードを実行できるようにするクラスを作成しました。これにより、アプリケーション ドメインを破棄して再作成できます: C# を使用した別のアプリケーション ドメインでのコードの実行
できません。プロセスは分離され独立しており、あるプロセスから別のプロセスにスレッドを転送することはできません。
ただし、内部でメモリ リークを絶対に修正できない場合は、実行が停止するたびにアプリを起動するウォッチドッグ プログラムを作成し、アプリを単一実行モードでのみ実行するように設定することができます。