【问题标题】:What Xamarin.iOS does with memory management when it compiles C# to native code?Xamarin.iOS 在将 C# 编译为本机代码时对内存管理做了什么?
【发布时间】:2013-04-09 16:11:58
【问题描述】:

Xamarin.iOS 对内存管理有什么作用?使用通常的 IL,我们有垃圾收集器,它负责处理未使用的对象并让程序员免于调用 delete。当 Xamarin 将代码编译为本机时,这是如何工作的?谁来清理不再使用的物品?

这个问题回答了编译是如何工作的,但没有解释内存管理部分:How MonoTouch works?

【问题讨论】:

    标签: c# xamarin.ios garbage-collection


    【解决方案1】:

    answer you seek 是针对您链接的问题提供的。

    总而言之,IL 到本机的翻译过程是提前完成的,但 Mono 运行时的其他部分仍然是必需的。 JIT 编译只是运行时执行的任务之一,这个特定的部分与 iOS 的内存限制不兼容(可写内存页也不能​​执行,这是 JIT 运行所必需的)。这是,AFAIK,完全需要提前 (AOT) 编译的唯一原因。

    Mono 垃圾收集器确实可以在 iOS 上运行,它只是嵌入到 Monotouch 编译器生成的二进制文件中。生成的二进制文件包含您的 AOT 编译的应用程序代码以及您使用的库的 AOT 编译版本,以及 Mono 运行时的精简版本。

    【讨论】:

    • 谢谢。不知何故,我无法从相关问题中得出这个结论。这是否意味着由于要执行更多代码并且垃圾收集器在技术上与应用程序并行工作,Xamarin.iOS 应用程序比本机(用 Obj-C 编写)应用程序慢?差别大吗?
    • @vladimir 那是因为那里接受的答案是错误的。
    • @vladimir 更慢?大概。足够慢以至于用户注意到?这一切都取决于应用程序正在做什么。
    • 同意。这完全取决于应用程序的类型。内存使用情况如何?我假设应用程序中使用的托管对象与本机相比具有一些线性内存增加(1x 也是线性的)。但是 Mono 运行时显然会增加一些额外的内存使用量,这些内存使用量应该或多或少是静态的(从应用程序到应用程序都是一样的,并且不取决于应用程序本身有多大)。您知道 Xamarin.iOS 上的 Mono 运行时内存成本是多少(例如)吗?
    • 托管对象会更大,但不是线性的。例如,托管对象包括类型描述符(其大小恒定)和用于解析虚拟调用的 vtable(取决于类型上的虚拟方法的数量)。 Monotouch 应用程序必然会比完全等效的 Objective-C 应用程序使用更多的内存。同样,这是否是一个问题取决于应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2013-12-05
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多