Java虚拟机和CLR

时间:2009-01-17 17:06:49

标签: java .net bytecode cil vm-implementation

作为对Differences between MSIL and Java bytecode?这个问题的一种跟进,Java虚拟机如何工作与 .NET Framework 公共语言的工作方式有什么(主要)差异或相似之处?运行时(CLR)有效吗?

此外, .NET framework CLR是“虚拟机”还是没有虚拟机的属性?

5 个答案:

答案 0 :(得分:271)

答案 1 :(得分:25)

您的第一个问题是将JVM与.NET Framework进行比较 - 我假设您实际上打算与CLR进行比较。如果是这样,我想你可以写一本关于这个的小书(编辑:看起来像Benji已经有:-)

一个重要的区别是,与JVM不同,CLR被设计为与语言无关的架构。

另一个重要的区别是CLR专门设计用于实现与本机代码的高度互操作性。这意味着CLR必须在访问和修改本机内存时管理可靠性和安全性,并且在基于CLR的数据结构和本机数据结构之间也必须manage marshalling

要回答第二个问题,术语“虚拟机”是硬件世界中较早的术语(例如,IBM在20世纪60年代对360的虚拟化),这些术语过去是指底层机器的软件/硬件仿真,以实现与VMWare相同的东西。

CLR通常被称为“执行引擎”。在这种情况下,这是在x86之上的IL机器的实现。这也是JVM的作用,尽管你可以说CLR的多态字节码和JVM的类型字节码之间存在重要差异。

所以你第二个问题的迂腐回答是“不”。但这实际上取决于你如何定义这两个术语。

编辑: JVM和CLR之间的另一个区别是JVM(版本6)very reluctant将已分配的内存释放回操作系统,即使它可以。

例如,假设JVM进程最初启动并从操作系统分配25 MB内存。然后,应用程序代码尝试分配需要额外50 MB的分配。 JVM将从操作系统分配额外的50 MB。一旦应用程序代码停止使用该内存,它就会被垃圾收集,并且JVM堆大小将减少。但是,JVM只会释放某些very specific circumstances下分配的操作系统内存。否则,对于剩余的进程生命周期,内存将保持分配状态。

另一方面,如果不再需要CLR,则将已分配的内存释放回操作系统。在上面的示例中,一旦堆减少,CLR就会释放内存。

答案 2 :(得分:11)

有关差异的更多细节可以从各种学术和私人来源找到。一个很好的例子是CLR Design Choices

一些具体的例子包括:

  • 键入一些低级别的opperands,例如“添加两个整数”,其中CLR使用多态操作数。 (即fadd / iadd / ladd vs just add)
  • 目前,JVM进行更具侵略性的运行时分析和优化(即Hotspot)。 CLR目前进行JIT优化,但不进行运行时优化(即在运行时替换代码)。
  • CLR没有内联虚拟方法,JVM没有......
  • 支持CLR中的值类型,而不仅仅是“原语”。

答案 3 :(得分:9)

CLR和JVM都是虚拟机。

.NET Framework和Java运行时环境是各个VM及其库的捆绑。没有库,虚拟机就没用了。

答案 4 :(得分:-11)

它不是虚拟机,.net框架在第一次运行时将程序集编译为本机二进制文件:

在计算中,即时编译(JIT),也称为动态转换,是一种用于改善计算机程序的运行时性能的技术。 JIT建立在运行时环境中的两个早期想法:字节码编译和动态编译。它在本机执行代码之前在运行时转换代码,例如字节代码到本机代码。与解释器相比,性能的提高源于缓存转换代码块的结果,而不是每次满足时重新评估每一行或操作数(参见解释语言)。它还具有优于在开发时静态编译代码的优点,因为如果发现这是有利的,它可以重新编译代码,并且可以强制执行安全保证。因此,JIT可以结合解释和静态(提前)编译的一些优点。

几个现代运行时环境,例如Microsoft的.NET Framework,Java的大多数实现,以及最近的Actionscript 3,依赖于JIT编译来实现高速代码。

来源:http://en.wikipedia.org/wiki/Just-in-time_compilation

添加.NET框架包含一个虚拟机,就像Java一样。