托管代码的大小如何影响内存占用?

时间:2012-08-22 16:02:12

标签: memory-management windows-ce

我的任务是减少Windows CE 5.0应用程序的内存占用。我遇到了Rob Tiffany's highly cited article,它建议使用托管DLL将代码保留在进程的插槽之外。但有些事情我不明白。

文章说

  

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

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

  

它还减少了必须在

中分配的内存量

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

1 个答案:

答案 0 :(得分:1)

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

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

JITter也不只是JIT而且永远持有。它编译了必要的内容,并且在GC期间可以很好地调整未使用的编译代码,或者在一段时间内没有使用的编译代码。你永远不会看到整个组件JITTed并且进入过程缓慢(好吧,如果它可能是一个小组件,但它肯定不典型)。

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

根据我的经验,人们最常遇到的问题是使用CF应用程序,内存是使用GDI对象和绘图。位图占用了大量内存。即使它主要是在共享内存中,创建大量内存(以及画笔,笔等)而不是缓存和重用,这通常会带来大量托管应用内存占用。

对于更多细节this MSDN webcast on Compact Framework Memory Management,虽然陈旧,但仍然非常相关。