托管代码是指JIT还是GC?

时间:2011-09-27 16:27:33

标签: c# memory-management garbage-collection managed il

我已经看到了几个关于“托管”代码意味着什么的解释,有些针对托管代码编译成中间语言和JITed以及其他人谈论GC和内存管理的想法。哪个实际上是管理一种语言,还是两者兼而有之?

GC的答案很有意义,因为内存被管理(因此称为“托管代码”),但假设不能使用具有GC但是本机的语言(未编译为IL)。 GC和IL代码是否紧密耦合?

3 个答案:

答案 0 :(得分:2)

不,我不会说GC和IL是紧密耦合的。事实上,没有另一个人就可以存在 - 有时就是这种情况。

IL的主要目的是使其与平台无关,并允许JIT进行依赖于平台的非常具体的优化。例如,x86,x64,ARM等.JIT的目的是将IL转换为架构的本机代码,并对其进行正确优化。

您无法针对x86和ARM进行优化,因为平台太不同了。这就是每个特定平台都有JIT的原因。 JIT可以很好地了解它将面对的平台。作为代码作者,您可能不知道。

另一方面,GC是关于内存管理的。有许多垃圾收集器库用于不能编译为中间语言的软件。以this one为例,虽然很小但是完成了工作。关于这个问题也有很多papers

一个人可能没有另一个人存在,这不是我们经常看到的。

那么什么才能成为“托管”语言?对我来说,这意味着有一种涉及某种类型的虚拟机。在.NET的情况下,CLR。它提供各种服务,如GC,Jit,代码访问安全(CAS)等。

答案 1 :(得分:1)

http://en.wikipedia.org/wiki/Managed_code

这很清楚它的代码是管理的(通过在虚拟机下运行),而不是内存。

答案 2 :(得分:1)

托管代码意味着它由虚拟运行时计算机运行,通常意味着内存管理。这就是人们说“托管代码”时的意思。系统资源(例如内存分配)可以为您管理其他一些事情。

JIT与此无关。 JIT是某些虚拟运行时计算机的功能,但不是必需的。 Visual Basic 6使用运行时而不是JIT - 它是逐行解释的。 JIT在调用时编译一个代码单元。但是,.NET语言将使用实现JIT编译的.NET运行库。