asp.net – 在什么情况下,.NET进程和AppDomains在内存中共享加载
我正在寻找更多关于.NET应用程序何时和如何共享加载的程序集的详细信息.我有兴趣在操作系统进程之间进行共享,也可以在同一进程中的AppDomains之间进行共享.共享程序集通过避免在内存中拥有同一程序集的多个副本来减少系统内存使用,我认为这是主要的好处,但是有兴趣了解是否还有其他好处和/或含义.
到目前为止我学到了什么的总结… > Sysinternals process explorer可用于列出.NET进程的AppDomains和加载到每个AppDomain中的程序集. 注意.在安装了Visual Studio 2013的计算机上,可以在以下位置找到aspnet_intern.exe:
在.NET和Windows Server的更高版本中ASP.NET启动时间和内存使用情况进一步改进;请参阅ASP.NET App Suspend – responsive shared .NET web hosting,Performance Improvements for ASP.NET Shared Hosting Scenarios in .Net 4.5,但我不知道这些更改对这个问题有多重要. ASP.NET组件共享也在Introducing .NET 4.5本书中介绍. 还想知道JITted代码是否共享,因为加载的程序集由MSIL,资源,元数据等组成,并且当代码为JITted时必须分配进一步的内存. 还有关于在紧凑框架中组装共享的这个讨论(We Believe in Sharing,MSDN Blogs,Abhinaba Basu) — UPDATE — 我使用sysinternals VMMap tool来检查两个AppPools,一个是asp.net程序集国际设置,另一个没有.我也“感动”一个测试aspx页面,使ASP.NET加载所有程序集(并且一个global.asax运行少量的代码,因此导致一些JITting). 报告的两个AppPools的内存使用量非常相似,工作集,WS Private和WS Shareable基本相同.然而,“共享”AppPool中的WS Shared大得多.这是意想不到的(对我来说),因为没有其他进程要共享,但是VMMap显示的是在实际的AppPool中显示为共享内存的内存块(标记为’.text’和执行/读取保护),而在其他AppPool中的相同程序集不是共享的.我对此的解释是,进程中的虚拟内存块被映射到相同的物理内存,然后被报告为“WS共享”. ASLR 关于装配空间布局随机化. VMMap工具显示了许多具有“Image(ASLR)”类型的内存块. ASLR将内存中的程序集的位置随机化,以防止恶意软件,我想知道这是否阻止了组装工作正常工作.使用EMET tool禁用机器的ASLR确??实使组装地址更加规则,但没有更改报告的内存数,因此似乎不影响装配实习.值得注意的是,VMMap仍然显示“ASLR”的图像,我怀疑只是意味着程序集/图像被标记为支持/允许ASLR,而不是ASLR生效. 解决方法
汇编共享发生的一种情况是使用ngen.exe编译为本地代码的程序集.让我引用“CLR通过C#”(第1章)
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – Oracle序列缓存老化过于频繁
- asp.net-mvc – 与Ninject集成测试
- asp.net – 应用程序域和应用程序池之间的区别?
- 剃刀 – 我应该在ASP.NET MVC 3中放置声明式HTML助手
- asp.net core html 选择框checked选中
- asp.net-mvc – 为什么在ASP.NET MVC中使用lambdas而不是反
- 在ASP.NET MVC 3中使用Ajax和JsonResult
- asp.net – 在TextChanged上停止回发
- asp.net-mvc-3 – 强制重新验证mvc3不显眼的远程验证
- asp.net – 使用实体框架进行部署后数据库更改的最佳实践