我创建了2个.NET应用程序并在一台机器上运行 - 有多少CLR和gc将在那里?
此外:我想了解一下Windows如何处理COM组件和CLR的背景信息。希望有人可以详细说明CLR如何在内存中加载,以及如果我在运行此命令时列出多个CLR实例,这意味着什么:
tasklist /m mscor*
实际上是多个CLR还是单个CLR作为所有.NET进程的COM服务器?
答案 0 :(得分:10)
每个进程都有自己的CLR副本作为托管进程。但是,由于CLR实际上只是几个DLL,Windows将能够在进程之间共享DLL。有关详细信息,请参阅:http://msdn.microsoft.com/en-us/magazine/cc301727.aspx
答案 1 :(得分:7)
除了Portable Executable (PE format)之外,托管exe还有一个额外的 CLR标头。操作系统现在能够确定启动的exe是否是“托管”exe,因此在后台加载CLR并赋予其控制权。
从上面可以看出,每个托管可执行文件的进程都有自己的CLR副本(2个Dll)。 ManagedExecutable1可能正在使用CLR v1,而ManagedExecutable2可能正在使用CLR v2。截至目前,它们尚未共享 垃圾收集器是CLR的一部分,因此在托管可执行文件的进程中也是不同的。
答案 2 :(得分:1)
我想说你可以通过检查加载的dll来轻松计算运行或加载CLR的进程。但我不确定您是否能够计算运行的应用程序域的数量。但我认为这不是你的目标。
每个进程只有一个堆,还有一个GC,它在收集期间挂起所有托管线程。因此,您可以遍历这些进程并检查是否加载了mscorlib,如果是这样,您可以假设它正在运行.NET CLR和GC。我确信应该有更好的方法来确定进程是否托管了CLR,请检查CLR API。
请通过C#尝试Jeffrey Richter的书CLR,以便更加了解。
下面的代码迭代.NET进程
// Import these namespaces
using System.Diagnostics;
using System.ComponentModel;
// Here is the code
Process[] prcs = Process.GetProcesses();
foreach (Process prc in prcs)
{
try
{
foreach (ProcessModule pm in prc.Modules)
{
if (pm.ModuleName.Contains("mscorlib"))
{
Console.WriteLine(prc.ProcessName);
}
}
}
catch (Win32Exception exWin)
{
// Cannot detemine process modules ... some will deny access
}
}
答案 3 :(得分:0)