我有一个为许多域托管的ASP.NET应用程序,并且所有域都映射到相同的根文件夹,即代码库。如果我将当前位于bin文件夹中的DLL加载到GAC中,它会花费更少的记忆吗?要将DLL加载到GAC以进行共享(安全方面除外)的任何特殊代码注意事项?
有没有办法让DLL在.NET环境中共享?
谢谢
克里斯
答案 0 :(得分:3)
将DLL放入GAC无助于内存使用。 DLL仍然需要加载到每个应用程序域中,并且它们不在共享内存中。
使用GAC的目的是集中分发程序集 - 因此可以在一个地方管理更改。听起来这是你仍然可以从中受益的东西。
答案 1 :(得分:0)
正如Oded explained只是将它们放入GAC无济于事。可能有帮助的是将它们放入GAC和NGEN组件中。请参阅here和here。确保测量不同的内存使用,加载时间和整体性能,因为这些可能会受到NGEN的负面影响。请参阅here和here。
答案 2 :(得分:0)
实际上,@ Oded和@LarsTruijens接受的答案都是
不正确在GAC DOES 中放置程序集有助于减少内存使用。
Jeffrey Richter(来自Wintellect和.NET团队一起设计CLR的作者)在他的书CLR via C#中证实了这一点:
将程序集安装到GAC中有许多好处。 GAC使许多应用程序可以共享程序集,从而总体上减少了物理内存的使用 ....
Tess Ferrandez(Microsoft的https://blogs.msdn.microsoft.com/tess/2006/04/12/asp-net-memory-you-use-the-same-dll-in-multiple-applications-is-it-really-necessary-to-load-it-multiple-times的内存和性能专家)也对此进行了确认。
尽可能使用强名称,并将一个以上ASP.NET应用程序使用的所有程序集安装到全局程序集缓存(GAC)。 这将减少内存消耗。
我还通过在x64 WebAPI服务上进行测试(WinDbg,任务管理器和ProcExplorer)来证实了这一点。您会发现,GAC的应用程序的私有工作集更低。对于NGen,您会再次看到私有工作集减少了。但是,与基线相比,NGen'd应用程序中的页面错误也大大减少了(在我的测试中几乎减少了一半)。我发现GAC应用程序和非GAC应用程序在Page Faults上没有区别。
请注意,在某些情况下,最好的解决方案是通过将NGen的程序集安装到GAC中来结合NGen和GAC。这样可以优化共享程序集的应用程序之间的内存使用,并在应用程序启动时提高性能!