3

背景:在我的公司,我们正在开发一堆使用相同核心 dll 的应用程序。这些 dll 使用 Spring.net 的 IoC 容器来连接(自动连接)。所有应用程序都使用相同的 spring 配置文件,并且该配置文件指向许多不同 dll 中的许多类。但并非所有应用程序都需要每个 dll 的功能。但是由于 IoC 容器的工作方式,所有的 dll 都为 Spring.net 加载以检查类型并检查它们实现的接口等等。

核心问题:我知道最好只加载您真正使用的dll。但是仅仅加载一个托管的dll对内存使用真的很糟糕吗?还是首先您在 dll 中使用类,并且它们正在 JIT 中使用最多的内存?

4

4 回答 4

1

我不认为这很糟糕。唯一的问题是,由于元数据和应用程序占用的内存量很大,应用程序的某些正在使用的部分更有可能位于不同的内存页面,这可能会导致一些性能泄漏,但这是应用程序的非常低的部分,其中这类事情很关键。

于 2008-09-16T07:42:16.323 回答
1

真的很糟糕是一个难以量化的术语,我想这取决于事情的规模,总的来说,我会说如果你可以避免加载你不需要的东西,那么你应该这样做。但是当然如果你使用反射来确定你是否可以使用它,你首先必须加载它......鸡和鸡蛋的问题。

但是需要注意的是,一旦将程序集加载到应用程序域中,您就无法从该应用程序域中卸载它,但是可以动态创建应用程序域将程序集加载到其中并在您卸载整个应用程序域时完毕。

于 2008-09-16T07:43:24.103 回答
1

如果程序集中的任何代码都没有被使用过,那么最终来自该程序集的页面将从内存移动到页面文件中,以支持活跃使用的页面。在这种情况下,整体的长期影响可能很小。虽然,会对启动时间产生负面影响。

于 2008-09-16T08:06:36.857 回答
0

当然,由于从磁盘读取程序集和证据/安全检查,不使用它们加载 dll 会导致启动时间变慢。但是,如果内存是您关心的问题,您至少可以确定,如果您真的不使用任何类型的内存,那么您浪费的内存不会超过程序集的大小。当然,如果在 spring 配置中指定了这些类型,至少这些类型会被加载到内存中,并且它们的静态初始化程序(如果有的话)将被执行。在极少数情况下,这可能是一个问题。JITing 由 CLR 在每个方法的基础上完成,因此您不使用的方法不会浪费 cpu+内存。

在任何情况下,您都可以将配置文件拆分为多个分区,例如,将模块 A 的所有对象定义放入文件 moduleA.config,将模块 B 的所有定义放入文件 moduleB.config,并仅指定您的特定应用程序真正需要的那些模块。

hth,埃里希

PS:我还想建议您将 Spring for .NET 相关问题发布到我们的社区论坛——那里更有可能回答您的问题。

于 2009-01-04T15:05:32.580 回答