c#Java的JVM和Java的内部工作方式有什么不同。NET的CLR?
Java的JVM和Java的内部工作方式有什么不同。NET的CLR
也许一个起点是,它们在各自的环境(Java>;JVM>;机器代码)(C#>;CLR>;IL)中基本相同吗
更新:有几个人提到了我试图讲述的要点:
- 垃圾收集
- 装箱/拆箱
- JIT调试
- 泛型/模板
- 请随意提出其他能区分两者的好话题李>
这听起来很有趣:
Already posted this once but here is a series of interviews with c# chief language designer Anders Hejlsberg.
# 1 楼答案
从here。我说得再好不过了(好吧,除了一场火焰战,这是一个没有火焰的地方:-)
# 2 楼答案
正如文科所说,全部细节远远超出了论坛帖子的范围。区别/相似之处归结为:
它们都是一个运行时环境“沙盒”,其中包括一个“即时”编译器,用于将中间语言(MSIL或字节码)中的程序指令转换为本机代码,并提供自动内存管理(垃圾收集)。位于各自运行时环境之上的是一组类库,它们为开发人员提供更高级别的抽象,以简化开发任务
这些运行时环境实际上是如何实现的,其内部大部分是微软和Sun的专有技术。例如,垃圾收集系统使用的算法虽然在技术功能上可能相似,但在实现上却不同
# 3 楼答案
CLR和JVM的目标和理念不同于您的想象。一般来说,JVM的目标是优化更动态、更高级的代码,而CLR为您提供了更多的低级工具来自己进行此类优化
堆栈分配就是一个很好的例子。在CLR上,有自定义值类型的显式堆栈分配。在JVM上,唯一的自定义类型是引用类型,但JVM可以在某些情况下通过转义分析将堆分配转换为堆栈分配
另一个例子。在Java中,默认情况下方法是虚拟的。至少在C#上,他们不是。优化虚拟方法调用要困难得多,因为在给定调用站点执行的代码无法静态确定
在幕后,他们的执行系统完全不同。大多数JVM(尤其是Hotspot)都是从字节码解释器开始的,并且只有JIT编译了大量执行的部分代码,例如紧循环。他们还可以使用从以前的运行中收集的执行统计信息反复编译这些数据,以推动优化。这使得更多的优化工作可以应用到程序中最需要的部分。这被称为自适应优化
CLR只提前编译一次所有内容。它进行的优化更少,这既是因为它有更多的代码要编译,因此必须更快,也是因为它没有任何实际执行路径的统计信息来提供给它的优化。这种方法确实有一个非常显著的优势,即允许跨进程缓存编译结果,CLR可以,而JVM不能
Hotspot JVM代码中有很大一部分专门用于这些自适应优化,正是这些优化使Java在性能上与21世纪初大多数通用计算中的本机代码保持一致。它们也使JVM成为动态语言的理想目标。这里我不包括动态语言运行时和InvokedDynamic的最新开发,因为我对DLR了解不够
# 4 楼答案
一个本质的区别是JVM可以跨平台移植,可以在Linux、Macintosh以及许多手机和嵌入式设备上运行
CLR在Microsoft支持的平台上运行,Mono项目在其他几个平台上提供了对旧版本CLR的部分支持
在内部,这意味着JVM的性能将根据平台本身提供的功能在不同的平台上有所不同
# 5 楼答案
米格尔·德伊卡扎提到:
不过,这些评论涉及一些细节,比如尾部调用优化。但自2002年以来,情况发生了很大变化——CLR和JVM现在都有多种语言针对它。但还是值得一读
# 6 楼答案
这应该是一条很棒的线
CLR和JVM之间最大的区别之一是CLR对泛型的本机集成
Java取而代之的是删除泛型类型,JVM只能通过自动装箱看似伪泛型的对象来处理对象