.NETで型がガベージコレクションされていないことはよく知られています。つまり、f.exで遊んでいる場合は、 Reflection.Emit、あなたはAppDomainsをアンロードするように注意しなければなりません。少なくとも、それは私が物事の仕組みを理解するために使った方法です。MakeGenericType /ジェネリック型はガベージコレクションされていますか?
genericタイプがであるかどうか疑問に思っていました。具体的には、MakeGenericType
で作成されたジェネリックは、たとえばユーザー入力に基づいています。 :-)
だから私は、次のテストケースを構築:あなたが見ることができるように
public interface IRecursiveClass
{
int Calculate();
}
public class RecursiveClass1<T> : IRecursiveClass
where T : IRecursiveClass,new()
{
public int Calculate()
{
return new T().Calculate() + 1;
}
}
public class RecursiveClass2<T> : IRecursiveClass
where T : IRecursiveClass,new()
{
public int Calculate()
{
return new T().Calculate() + 2;
}
}
public class TailClass : IRecursiveClass
{
public int Calculate()
{
return 0;
}
}
class RecursiveGenericsTest
{
public static int CalculateFromUserInput(string str)
{
Type tail = typeof(TailClass);
foreach (char c in str)
{
if (c == 0)
{
tail = typeof(RecursiveClass1<>).MakeGenericType(tail);
}
else
{
tail = typeof(RecursiveClass2<>).MakeGenericType(tail);
}
}
IRecursiveClass cl = (IRecursiveClass)Activator.CreateInstance(tail);
return cl.Calculate();
}
static long MemoryUsage
{
get
{
GC.Collect(GC.MaxGeneration);
GC.WaitForFullGCComplete();
return GC.GetTotalMemory(true);
}
}
static void Main(string[] args)
{
long start = MemoryUsage;
int total = 0;
for (int i = 0; i < 1000000; ++i)
{
StringBuilder sb = new StringBuilder();
int j = i;
for (int k = 0; k < 20; ++k) // fix the recursion depth
{
if ((j & 1) == 1)
{
sb.Append('1');
}
else
{
sb.Append('0');
}
j >>= 1;
}
total += CalculateFromUserInput(sb.ToString());
if ((i % 10000) == 0)
{
Console.WriteLine("Current memory usage @ {0}: {1}",
i, MemoryUsage - start);
}
}
Console.WriteLine("Done and the total is {0}", total);
Console.WriteLine("Current memory usage: {0}", MemoryUsage - start);
Console.ReadLine();
}
}
を、一般的なタイプは再帰の終わりを示す「テール」クラスで、「おそらく再帰的な」が定義されています。そして、GC.TotalMemoryUsage
が不正行為ではないことを確認するために、私もタスクマネージャを開いた。
これまでのところとても良いです。私がした次のことは、この獣を撃ち上げることでした。そして、私は 'Out of memory'を待っていました。私はそれが私の期待に反することに気付きました。は、実際には、時間の経過とともにメモリー消費量がわずかに低下します。
誰か説明していただけますか?ジェネリック型は実際にGCによって収集されますか?もしそうなら...反射もありますか?ガベージコレクションはどうですか?
あなたは 'Target'は、GCのパスを実行した後にnullであるかどうかを確認、その後、あなたの作成したジェネリック型に' WeakReference'を作成することによって、実験ができます。 –
これは、[ジェネリックスはJITコンパイラによってどのようにコンパイルされるのですか?](http://stackoverflow.com/questions/5342345/how-do-generics-get-compiled-by-the-jit-compiler) –