Java的JVM和.NET的CLR的内部工作有什么区别?

时间:2008-09-12 14:49:13

标签: c# java .net clr jvm

Java JVM和.NET CLR的内部工作有什么区别?

也许是一个起点,它们在各自的环境中基本相同(Java> JVM>机器代码)(C#> CLR> IL)。


更新:有几个人提到了我试图涵盖的观点:

  1. 垃圾收集
  2. 拳击/开箱
  3. JIT调试
  4. 泛型/模板
  5. 请随意提出其他可以区分两者的好主题。
  6. @George Mauer - 听起来非常有趣:

      

    已经发布了一次,但这里有一个series of interviews与c#主要语言设计师Anders Hejlsberg。

8 个答案:

答案 0 :(得分:9)

这应该是一个很好的主题。

CLR与JVM之间最大的区别之一就是CLR与泛型的原生集成。

Java取而代之的是删除泛型类型,而JVM只能通过自动装箱看似伪随机的对象来处理对象。

答案 1 :(得分:6)

来自here。我不能说得更好(嗯,除了火焰战争,这是一个无焰的地方:-))。

  

您好,

     

似乎回答了你的问题   通过启动火焰充满危险   战争,所以我会谨慎行事。

     

有许多根本   两者之间的技术相似性   Java运行时和公共语言   运行时,包括垃圾收集   记忆,一种中间语言   (Microsoft IL与Java ByteCode),   核心系统库,并支持   相当高级的语言,代码   安全性和部署。

     

然而,这些'相似'领域中的每一个   也有一些相当大的   微小的差异,它超越了   一个简单的论坛帖子的范围   描述他们中的大多数。

     

我建议再询问一下   关于任何一个问题的目标问题   各种运行时功能和组件   区域(例如内存管理,   编译,系统库,   安全等)然后我们可以   提供更有针对性的回应   (例如博客,技术文章或   一些书)。

答案 2 :(得分:2)

一个重要区别是JVM可跨平台移植,可在Linux,Macintosh以及许多手机和嵌入式设备上运行。

CLR在Microsoft支持的平台上运行,Mono项目在更多版本的CLR上提供部分支持。

在内部,这意味着JVM的性能将根据平台本身提供的功能在不同平台上有所不同。

答案 3 :(得分:2)

CLR和JVM的目标和理念不同于您的想法。通常,JVM旨在优化更动态,更高级别的代码,而CLR为您提供更多低级工具来自行执行这些类型的优化。

一个很好的例子是堆栈分配。在CLR上,您可以显式定义自定义值类型的堆栈。在JVM上,唯一的自定义类型是引用类型,但JVM可以通过Escape Analysis在特定情况下将堆分配转换为堆栈分配。

另一个例子。在Java中,默认情况下方法是虚拟的。至少在C#上,它们不是。优化虚方法调用要困难得多,因为无法静态确定在给定调用站点执行的代码。

在幕后,他们的执行系统是完全不同的。大多数JVM(特别是Hotspot)都是从字节码解释器开始的,并且只有JIT编译的代码部分被大量执行,例如:紧环。他们还可以使用从先前运行中收集的执行统计信息一次又一次地重新编译这些以驱动优化。这允许将更多优化工作应用于最需要它的程序部分。这称为自适应优化。

CLR只预编译一次。它的优化次数较少,因为它有更多的代码需要编译,因此必须快速,因为它没有任何实际执行路径的统计信息来提供给它的优化。这种方法确实具有非常显着的优势,允许您跨进程缓存编译结果,CLR会这样做,但JVM却没有。

很大一部分热点JVM代码专门用于这些自适应优化,它们使Java与21世纪初大多数通用计算的本机代码处于相同的性能范围。它们也是使JVM成为动态语言的理想目标的原因。我在这里排除了动态语言运行时和invokedynamic的最新发展,因为我对DLR知之甚少。

答案 4 :(得分:1)

Miguel de Icaza提到here

  

经验丰富的行业程序员会注意到以上情况   非常像Java和Java VM。他们是对的,上面的   就像Java一样。

     

CIL有一个在Java中找不到的功能:它是   字节代码表示,功能强大,足以用作   许多语言的目标:从C ++,C,Fortran和Eiffel到Lisp   和Haskell包括Java,C#,JavaScript和Visual等   基本的混合。

     

我希望我有时间更详细,但为了这个缘故   这个论点,上面就足够了。

但是,评论会进入一些细节,例如尾部调用优化。自2002年以来,Lot已发生变化 - CLR和JVM现在都有多种语言针对它。但是值得一读。

答案 5 :(得分:0)

正如Vinko所说,全部细节超出了论坛帖子的范围。差异/相似之处归结为:

它们都是一个运行时环境“沙箱”,它包含一个“即时”编译器,用于将中间语言(MSIL或ByteCode)中的程序指令转换为本机机器代码,并提供自动内存管理(垃圾收集)。坐在相应运行时环境之上的是一组类库,它们为开发人员提供了更高级别的抽象,以简化开发任务。

这些运行时环境实际实现的内部结构大部分是Microsoft和Sun专有的。例如,垃圾收集系统使用的算法虽然在技术功能上可能类似,但在实现方面却有所不同。

答案 6 :(得分:0)

据我所知,.Net CLR仍然在运行时内置了更加灵活和强大的代码访问安全性,允许更精细的权限和执行策略。

答案 7 :(得分:-1)

垃圾收集也存在差异。 JVM使用复制收集器和标记和扫描。 .NET用户复制收集器和Mark和compact(更难实现)。

Flyswat提到的类型擦除也很重要。 JVM没有关于泛型的线索,一切都是对象和相关的perf。拳击和拆箱的惩罚。反射也不会给你一般信息。 CLR原生支持泛型。