内存中的共享库(dll) - 多少份?

时间:2014-03-15 11:46:49

标签: .net dll .net-assembly

如果我有两个.Net应用程序引用GAC中的相同库,并且我同时启动了两个应用程序并执行使用共享库的代码(甚至一个接一个),那么库的副本数量将会是多少驻留在记忆中?

我问的原因是我正在尝试提高应用程序中进程的首次执行速度,通过从GAC加载一些库来占用首次执行的大部分。我正在考虑通过以前运行引用和使用相同库的小应用程序(可能在Windows启动时)预加载这些。

运行的第二个应用程序是否可以访问现在驻留库的同一副本,还是仍然需要加载自己的副本? Instinct告诉我,只需要将一个副本加载到内存中,但事情并不像你期望的那样!

1 个答案:

答案 0 :(得分:0)

GAC是程序集的“共享”位置,因此您不必在磁盘上保留它们的多个副本,它不是共享内存。因此,在内存中,您将拥有使用它的每个进程的dll副本。

共享内存,就像使用同一个dll实例的两个进程一样,是一个完全不同的动物。

如果你正在考虑节省Jit你的程序集所需的时间,就像你的小应用程序受到攻击一样,GAC与它无关。它是.net框架本身处理它,它缓存编译的程序集。因此,鉴于你的小应用程序'练习'程序集就像调用足够的代码来强制JIT编译一样,下一个应用程序将看到一个好处,无论它是否像你希望仍然有待观察一样大。这是一个快速的胜利,但是..

所以你更有可能产生持久和可预测的影响,因为我可以自己分解我的代码,这样所有这些东西都不需要在我可以做任何事情之前集体加载。