我的任务是减少Windows CE 5.0
应用程序的内存占用。我遇到了Rob Tiffany's highly cited article,它建议使用托管DLL将代码保留在进程的插槽之外。但有些事情我不明白。
文章说
JIT编译器正在您的插槽中运行,它从1中拉入IL 根据需要编译当前调用堆栈的GB空间。
这意味着托管DLL中的所有代码最终都可能最终进入进程的插槽。虽然这将通过不加载公共区域中的代码来帮助其他进程,但它如何帮助此过程? FWIW文章确实提到了
它还减少了必须在
中分配的内存量
我唯一想到的是,就像代码被拉入插槽一样,它也被推送/换出。但这只是一个疯狂的猜测,可能完全错误。
答案 0 :(得分:1)
CF程序集不像本机DLL一样加载到进程槽中。它们实际上是作为内存映射文件访问的。这意味着DLL的大小实际上是无关紧要的。
托管堆也位于共享内存中,而不是您的进程槽中,因此对象分配不太可能导致进程槽分段或OOM。
JITter也不只是JIT而且永远持有。它编译了必要的内容,并且在GC期间可以很好地调整未使用的编译代码,或者在一段时间内没有使用的编译代码。你永远不会看到整个组件JITTed并且进入过程缓慢(好吧,如果它可能是一个小组件,但它肯定不典型)。
显然,必须使用一些进程槽内存来创建一些指针,堆栈存储等,但是大多数托管代码对进程槽限制的影响比本机代码要小。当然,你仍然可以通过大堆栈,P / Invokes,原生分配等来达到极限。
根据我的经验,人们最常遇到的问题是使用CF应用程序,内存是使用GDI对象和绘图。位图占用了大量内存。即使它主要是在共享内存中,创建大量内存(以及画笔,笔等)而不是缓存和重用,这通常会带来大量托管应用内存占用。
对于更多细节this MSDN webcast on Compact Framework Memory Management,虽然陈旧,但仍然非常相关。