red*_*alx 15 .net asp.net appdomain shared-memory .net-assembly
我正在寻找有关.NET应用程序何时以及如何共享加载程序集的更多详细信息.我有兴趣在OS进程之间共享,也在同一进程内的AppDomains之间共享.共享程序集通过避免在内存中具有相同程序集的多个副本来减少系统内存使用量,我认为这是主要的好处,但有兴趣知道是否存在其他好处和/或影响.
到目前为止我学到的内容摘要......
Sysinternals进程资源管理器可用于列出.NET进程的AppDomain以及加载到每个AppDomain中的程序集.
.NET进程似乎总是将"核心"程序集加载到名为"SharedDomain"的AppDomain中(假设这在当前进程中的AppDomain之间共享是合理的).
任务管理器和Process Explorer报告"工作集共享"和"工作集可共享"的内存使用数量不是无关紧要,但不清楚共享的内容.(它是共享AppDomain中的'核心'程序集吗?其他[非核心]程序集是否也共享?
在一个简单的测试中,我推出了两个独立的.NET应用程序副本,并为每个应用程序附加了一个Visual Studio调试器."模块"视图显示已加载的程序集及其在内存中的地址.在我的测试用例中,每个加载的模块都位于两个进程中的相同地址.(这是否表示共享,或者这个虚拟地址空间是否必须共享?)
ASP.NET 4.5通过一个叫做装配实习机制支持组件的共享(见看在ASP.NET 4.5共享通用组件,分享共同组件,与aspnet_intern.exe共享通用组件).它似乎通过设置文件系统符号链接(符号链接)来工作,以便不同的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应用程序暂停 - 响应式共享.NET Web主机,.Net 4.5中的ASP.NET共享主机方案的性能改进,但我不确定这些更改与此问题的相关性如何.
ASP.NET程序集共享也包含在.NET 4.5简介中.
还想知道JITted代码是否共享,因为加载的程序集由MSIL,资源,元数据等组成,并且当代码被JIT时必须分配更多内存.
在紧凑框架中也有关于汇编共享的讨论(我们相信共享,MSDN博客,Abhinaba Basu)
--- UPDATE ---
我使用sysinternals VMMap工具来检查两个AppPools,一个用asp.net程序集internign设置,另一个没有.我还"触摸"了一个测试aspx页面,导致ASP.NET加载所有程序集(并且global.asax运行少量代码,因此导致一些JITting).
报告的两个AppPools的内存使用数据非常相似,工作集,WS Private和WS Shareable基本相同.但是,在"实习"AppPool中,WS Shared要大得多.这是意外的(对我来说),因为没有其他进程可以与之共享,但VMMap显示的是内存块(标记为'.text'并具有执行/读保护),这些内存块在实习AppPool中显示为共享内存,而另一个AppPool中的相同程序集不共享.我对此的解释是,进程中的虚拟内存块被映射到同一物理内存,然后报告为"WS Shared".
ASLR
关于装配空间布局随机化.VMMap工具显示许多类型为"Image(ASLR)"的内存块.ASLR随机化了内存中程序集的位置以阻止恶意软件,我想知道这是否会阻止程序集实习工作正常.使用EMET工具禁用机器的ASLR 会导致程序集地址更加规则,但不会更改报告的内存数,因此它似乎不会影响程序集实习.值得注意的是VMMap仍然显示带有'ASLR'的图像,我怀疑这只是意味着装配/图像被标记为支持/允许ASLR,而不是ASLR生效.
发生程序集共享的一种情况是使用 ngen.exe 将程序集编译为本机代码。让我引用“CLR via C#”(第 1 章)
\n\n\nNGen.exe 工具在两种情况下很有趣:
\n...
\n减少应用程序\xe2\x80\x99 工作集 - 如果您认为某个程序集将同时加载到多个进程中,则在该程序集上运行 NGen.exe 可以减少应用程序\xe2\x80\x99 工作集。原因是 NGen.exe 工具将 IL 编译为本机代码并将输出保存在单独的文件中。该文件可以同时内存映射到多进程地址空间,从而允许共享代码;并非每个进程都需要自己的代码副本。
\n
| 归档时间: |
|
| 查看次数: |
944 次 |
| 最近记录: |