gpt4 book ai didi

asp.net - .NET进程和AppDomains在什么情况下会共享内存中已加载的程序集?

转载 作者:行者123 更新时间:2023-12-03 20:58:56 30 4
gpt4 key购买 nike

我正在寻找有关.NET应用程序何时以及如何共享加载的程序集的更多详细信息。我对OS进程之间以及同一进程内的AppDomain之间的共享感兴趣。共享程序集通过避免在内存中使用同一程序集的多个副本来减少系统内存使用量,我想这是主要的好处,但希望知道是否还有其他好处和/或含义。

到目前为止我所学的总结...


Sysinternals process explorer可用于列出.NET进程的AppDomain和加载到每个AppDomain中的程序集。
.NET进程似乎总是将“核心”程序集加载到名为“ SharedDomain”的AppDomain中(合理地假设此进程在当前进程中的AppDomain之间共享)。
任务管理器和Process Explorer报告的“共享的工作集”和“共享的工作集”的内存使用量并不微不足道,但尚不清楚正在共享什么。 (这是Shared AppDomain中的“核心”程序集吗?是否也共享其他[非核心]程序集?
在一个简单的测试中,我启动了一个独立的.NET应用程序的两个副本,并将每个副本都附加了一个Visual Studio调试器。 “模块”视图显示加载的程序集及其在内存中的地址。在我的测试案例中,每个加载的模块在两个进程中位于相同的地址。 (这是否表示共享,或者此虚拟地址空间不一定共享?)
ASP.NET 4.5支持通过称为程序集实习的机制共享程序集(请参见Look at Sharing Common Assemblies in ASP.NET 4.5Sharing Common AssembliesSharing common assemblies with aspnet_intern.exe)。它似乎通过设置文件系统符号链接(symlinks)起作用,以便不同的Web应用程序指向共享的bin文件夹,因此这引发了一个问题,即ASP.NET是否仅使用符号链接来触发.NET中的标准程序集共享行为。 ,或者是否还有特定于ASP.NET和IIS AppPools的内容。


注意。在安装了Visual Studio 2013的计算机上,可以在以下位置找到aspnet_intern.exe:


C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1
工具\


在更高版本的.NET和Windows Server中,ASP.NET的启动时间和内存使用有了进一步的改进。请参见ASP.NET App Suspend – responsive shared .NET web hostingPerformance Improvements for ASP.NET Shared Hosting Scenarios in .Net 4.5,但我不确定这些更改与该问题的相关性。

Introducing .NET 4.5》还介绍了ASP.NET程序集共享。

还想知道是否共享了JITted代码,因为加载的程序集由MSIL,资源,元数据等组成,并且在对代码进行JITted时必须分配更多的内存。

在紧凑的框架中也有关于程序集共享的讨论(We Believe in Sharing,MSDN博客,Abhinaba Basu)

-更新-

我使用sysinternals VMMap tool检查了两个AppPool,一个设置了asp.net程序集的内部设置,另一个没有设置。我还“触摸”了一个测试aspx页面,以使ASP.NET加载所有程序集(而global.asax运行少量代码,因此导致一些JITting)。

报告的两个AppPool的内存使用情况数据非常相似,工作集,WS Private和WS Shareable基本相同。但是,“共享” AppPool中的WS Shared更大。这对我来说是意外的,因为没有其他进程可以共享,但是VMMap显示了内存块(标记为“ .text”并具有“执行/读取”保护)在内部AppPool中显示为共享内存,而其他AppPool中的同一程序集不共享。我对此的解释是,进程中的虚拟内存块被映射到同一物理内存,然后报告为“ WS Shared”。

单反

关于装配空间布局随机化。 VMMap工具显示许多类型为“ Image(ASLR)”的内存块。 ASLR随机分配程序集在内存中的位置以阻止恶意软件,我想知道这是否妨碍了程序集的正常工作。使用EMET tool为计算机禁用ASLR确​​实使程序集地址更规则,但没有更改报告的内存号,因此,这似乎并不影响程序集的内部。值得注意的是,VMMap仍然对它们显示带有“ ASLR”的图像,我怀疑这只是意味着程序集/图像被标记为支持/允许ASLR,而不是ASLR生效。

最佳答案

发生程序集共享的一种情况是使用ngen.exe将程序集编译为本机代码。让我引用“通过C#进行CLR”(第1章)

NGen.exe工具在两种情况下很有趣:
...
减少应用程序的工作集-如果您认为程序集将同时加载到多个进程中,则在该程序集上运行NGen.exe可以减少应用程序的工作集。原因是因为NGen.exe工具将IL编译为本机代码并将输出保存在
单独的文件。该文件可以被内存映射为多进程
同时寻址空间,允许代码共享;不
每个进程都需要自己的代码副本。

关于asp.net - .NET进程和AppDomains在什么情况下会共享内存中已加载的程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31288769/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com