2

我的任务是减少Windows CE 5.0应用程序的内存占用。我遇到了Rob Tiffany 的高引用文章,该文章建议使用托管 DLL 将代码保留在进程的插槽之外。但是有一点我不明白。

文章说

JIT 编译器在您的插槽中运行,它根据需要从 1 GB 空间中提取 IL 以编译当前调用堆栈。

这意味着托管 DLL 中的所有代码最终都可能最终出现在进程的插槽中。虽然这将通过不在公共区域加载代码来帮助其他进程,但它如何帮助这个进程?FWIW文章确实提到了

它还减少了必须在您的内部分配的内存量

我唯一的想法是,就像将代码拉入插槽一样,它也会被推/换出。但这只是一个疯狂的猜测,可能完全是错误的。

4

1 回答 1

1

CF 程序集不会像原生 DLL 那样加载到进程槽中。它们实际上是作为内存映射文件访问的。这意味着 DLL 的大小实际上是无关紧要的。

托管堆也位于共享内存中,而不是您的进程槽中,因此对象分配不太可能导致进程槽碎片或 OOM。

JITter 也不只是 JIT 并且永远保持。它编译必要的内容,并且在 GC 期间可能会很好地推销未使用或一段时间未使用的已编译代码。您永远不会看到整个程序集被 JTTed 并缓慢地拉入流程(如果它可能是一个小程序集,但它肯定不是典型的)。

显然,必须使用一些进程槽内存来创建一些指针、堆栈存储等,但总的来说,托管代码对进程槽限制的影响要小于本地代码。当然,您仍然可以通过大堆栈、P/Invokes、本机分配等来达到极限。

以我的经验,人们在使用 CF 应用程序时最常遇到麻烦的领域是 GDI 对象和绘图。位图占用大量内存。尽管它主要在共享内存中,但创建大量它们(以及画笔、钢笔等)而不是缓存和重用是最常导致大量托管应用程序内存占用的原因。

有关Compact Framework 内存管理的 MSDN 网络广播的更多详细信息,虽然很旧,但仍然非常相关。

于 2012-08-22T17:32:43.747 回答