使用相同应用程序池的 IIS Web 应用程序是否在内存中共享 DLL?

Do IIS Web Applications that use the same App Pool share DLLs in memory?

我继承了一个大型网站。对于用户来说,它由 20 个具有不同功能的“模块”组成。每个模块都可以通过其他模块的菜单访问。

每个模块都在 IIS 中作为单独的 Web 应用程序实现,都位于默认网站下。他们都使用相同的应用程序池。全部在 ASP.NET Core (net5) 中实现。

这些模块共享大约 70% 的代码。该库代码位于多个项目中。 Web 应用程序项目都具有对库 DLL 的引用。构建完所有内容后,每个 Web 应用程序项目的 bin 文件夹都有库 DLL 的副本(因此磁盘上每个库 DLL 有 20 个副本)。

假设 Web 应用程序 1 正在接收请求并已加载到服务器内存中。如果 Web 应用程序 2 然后被加载到服务器内存中,那么库 DLL 是否会再次为 Web 应用程序 2 加载到内存中?或者 web 应用程序 2 是否会使用已经加载到 web 应用程序 1 内存中的库 DLL?比如web应用1和2加载到内存后,内存中的库cod是1份还是2份?

问题背后的原因是我需要减少网络服务器上的内存使用。拥有单独的 Web 应用程序没有运营优势。它们全部一次性部署在一起。我们永远不会只开始或停止其中一个,它总是全有或全无。想知道我是否可以通过使用 1 个大型 Web 应用程序而不是 20 个较小的 Web 应用程序来节省内存。

同一应用程序池中的 ASP.NET 核心 Web 应用程序配置为使用 out-of-process hosting,因此它们的所有 assemblies/libraries 都加载到 单独的 .NET Core 进程中(基于 Kestrel)dotnet.exe 通常,或者在使用自包含部署时您自己的可执行文件)。

Diagrams in that Microsoft article make it super easy to understand the relationship among the runtime processes.

在该模式下,IIS 工作进程 w3wp.exe 仅加载 ASP.NET 核心模块作为反向代理。

结合以上两个,你的问题Do IIS Web Applications that use the same App Pool share DLLs in memory?的答案很明确,没有任何共享,并且由于进程边界,你也不能共享任何东西。