有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

c#Java的JVM和Java的内部工作方式有什么不同。NET的CLR?

Java的JVM和Java的内部工作方式有什么不同。NET的CLR

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


更新:有几个人提到了我试图讲述的要点:

  1. 垃圾收集
  2. 装箱/拆箱
  3. JIT调试
  4. 泛型/模板
  5. 请随意提出其他能区分两者的好话题

这听起来很有趣:

Already posted this once but here is a series of interviews with c# chief language designer Anders Hejlsberg.


共 (6) 个答案

  1. # 1 楼答案

    here。我说得再好不过了(好吧,除了一场火焰战,这是一个没有火焰的地方:-)

    Hello,

    Responding to your question seems fraught with peril by starting a flame war, so I'll proceed cautiously.

    There are a number of fundamental technical similarities between the Java Runtime and the Common Language Runtime, including garbage collected memory, an intermediate language (Microsoft IL versus Java ByteCode), core system libraries, and support for fairly high level languages, code security, and deployment.

    However, each of these 'similar' areas also have a number of sizable and small differences, and it's beyond the scope of a simple Forum post to describe most of them.

    I would suggest asking a more targetted question about any of the various runtime features and component areas (e.g. memory management, compilation, system libraries, security, etc.) and then we can provide a more targetted response (e.g. a blog, a technical article, or some books).

  2. # 2 楼答案

    正如文科所说,全部细节远远超出了论坛帖子的范围。区别/相似之处归结为:

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

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

  3. # 3 楼答案

    CLR和JVM的目标和理念不同于您的想象。一般来说,JVM的目标是优化更动态、更高级的代码,而CLR为您提供了更多的低级工具来自己进行此类优化

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

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

    在幕后,他们的执行系统完全不同。大多数JVM(尤其是Hotspot)都是从字节码解释器开始的,并且只有JIT编译了大量执行的部分代码,例如紧循环。他们还可以使用从以前的运行中收集的执行统计信息反复编译这些数据,以推动优化。这使得更多的优化工作可以应用到程序中最需要的部分。这被称为自适应优化

    CLR只提前编译一次所有内容。它进行的优化更少,这既是因为它有更多的代码要编译,因此必须更快,也是因为它没有任何实际执行路径的统计信息来提供给它的优化。这种方法确实有一个非常显著的优势,即允许跨进程缓存编译结果,CLR可以,而JVM不能

    Hotspot JVM代码中有很大一部分专门用于这些自适应优化,正是这些优化使Java在性能上与21世纪初大多数通用计算中的本机代码保持一致。它们也使JVM成为动态语言的理想目标。这里我不包括动态语言运行时和InvokedDynamic的最新开发,因为我对DLR了解不够

  4. # 4 楼答案

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

    CLR在Microsoft支持的平台上运行,Mono项目在其他几个平台上提供了对旧版本CLR的部分支持

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

  5. # 5 楼答案

    米格尔·德伊卡扎提到:

    Seasoned industry programmers will notice that the above is very much like Java and the Java VM. They are right, the above is just like Java.

    The CIL has one feature not found in Java though: it is byte code representation that is powerful enough to be used as a target for many languages: from C++, C, Fortran and Eiffel to Lisp and Haskell including things like Java, C#, JavaScript and Visual Basic in the mix.

    I wish I had the time to go in more detail, but for the sake of this argument, the above will suffice.

    不过,这些评论涉及一些细节,比如尾部调用优化。但自2002年以来,情况发生了很大变化——CLR和JVM现在都有多种语言针对它。但还是值得一读

  6. # 6 楼答案

    这应该是一条很棒的线

    CLR和JVM之间最大的区别之一是CLR对泛型的本机集成

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