FullGC は通常、実行中にすべてのスレッドを一時停止します。2 つの AppDomain があり、それぞれが複数のスレッドを実行しています。GC を実行すると、すべてのスレッドが一時停止しますか、それとも 1 つの AppDomain のスレッドのみが一時停止しますか?
2 に答える
答えるのは難しいです。最善の方法は、テストすることです。
using System;
using System.Reflection;
public class Program : MarshalByRefObject {
static void Main(string[] args) {
var dummy1 = new object();
var dom = AppDomain.CreateDomain("test");
var obj = (Program)dom.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Program).FullName);
obj.Test();
Console.WriteLine("Primary appdomain, collection count = {0}, gen = {1}",
GC.CollectionCount(0), GC.GetGeneration(dummy1));
Console.ReadKey();
}
public void Test() {
var dummy2 = new object();
for (int test = 0; test < 3; ++test) {
GC.Collect();
GC.WaitForPendingFinalizers();
}
Console.WriteLine("In appdomain '{0}', collection count = {1}, gen = {2}",
AppDomain.CurrentDomain.FriendlyName, GC.CollectionCount(0),
GC.GetGeneration(dummy2));
}
}
出力:
In appdomain 'test', collection count = 3, gen = 2
Primary appdomain, collection count = 3, gen = 2
GC が既定の CLR ホスト上のすべての AppDomains に影響することを示す良い証拠です。これには驚きました。
このスレッドから:.netのガベージコレクターはシステム全体ですか、それともアプリケーション全体ですか?、プロセスレベルで発生します。そのプロセス内のすべてのスレッドは一時停止されますが、複数のプロセス間では一時停止されません。
1つまたは複数のアプリドメインがプロセス内に存在できますが、アプリドメインはプロセス間で共有されません。あたり: http://blogs.msdn.com/b/tess/archive/2008/08/19/questions-on-application-domains-application-pools-and-unhandled-exceptions.aspx、「プロセス中のすべてのアプリドメイン同じGCを共有します。」したがって、GCがトリガーされると、GCはすべてのアプリドメインに影響を与えるはずです。
ただし、CPUパフォーマンスの低下は、GCの実行に時間を費やすプロセスが多すぎると発生する可能性があり、GCに関与しない他のプロセスのパフォーマンスに悪影響を与える可能性があります。
このリンクでは、GCの基本についても説明しています。