虚拟机(VM)是计算机操作系统的虚拟仿真。除此之外,这种系统抽象还有两种不同的实现方式。系统虚拟机作为功能齐全的操作系统存在,并且通常被创建为使用物理机的替代品。通过这种方式,多个环境可以同时在同一台机器上运行。想学习java技术的同学,不妨报个Java培训班,有明确清晰的学习路线,理论知识+实战操作,可以获得快速提升。
公共语言运行时(CLR)和Java虚拟机(JVM)都是进程虚拟机。这意味着,它们不是执行整个操作系统,而是专门设计用于运行进程或程序,而不依赖于平台环境。
深入了解CLR和JVM之间的相似之处
CLR和JVM都是虚拟机,它们都执行独立于平台的操作,即执行编译后的源代码。从本质上讲,这些虚拟机都是程序员源代码和系统机器代码之间的中间步骤,允许各种类型的处理器提高可用性。在下图中,你可以看到两者的高级功能实际上是完全相同的。
除了它们的基本功能外,两者还包括垃圾收集、运行时级安全性和异常处理的方法。最后一个相似之处是,两者都采用了基于堆栈的操作,这是存储和检索操作数及其结果的最常见方法。对java感兴趣的同学可以参加java培训,你可以学会更多的java新技术。
但是,当然,对于这些虚拟机共享的每一个相似之处,都可以发现实现上的差异。尽管如此,就像编程语言一样,这些虚拟机的开发以一种跳跃式的运动进行。其中一个实现了类似于“标记-扫描-紧凑”的垃圾收集方法,另一个很快就会实现。
主要区别
语言和平台兼容性
CLR和JVM之间的一个潜在的表面差异(尽管这可能影响了它们的开发方式)是,JVM是专门为与Java一起工作而创建的,而CLR是为与语言无关而设计的。相反,CLR最初只设计在Windows操作系统上运行,而JVM始终是操作系统无关的。不过,我们都知道,时代已经改变了,现在有了在Linux和Mac上运行的CoreCLR,并且已经开发了更多的语言来使用JVM。
这导致了这样一个事实,即在大多数情况下,CLR和JVM之间的差异也是使用它们的语言之间差异的象征。或者,你可以说,语言之间的一些最显著的差异(为了论证起见,让我们假设C#和Java)实际上是在VM级别实现的。想对java有更深入的了解,可以参加java培训,在专业老师的指导下,可以很全面地掌握java最新的相关知识和技能。
JIT编译
我们在VM级别看到的一个很大的区别是,尽管两者都使用JIT(实时)编译,但编译器不会被调用同时运行。CLR在运行时调用时会将所有MSIL代码编译为机器代码。JVM使用一个名为HotSpot的专用性能引擎将Java字节码JIT编译为机器可读代码。它的不同之处在于它编译和优化了代码中最常用的“热点”。
在性能方面,这些编译策略中的每一种都有自己的权衡。因为CLR在运行时调用时会对所有机器代码进行一次编译,所以在某些情况下可以提高执行时间。但另一方面,如果高频率需要一小部分代码,Java的HotSpot编译器可以随着时间的推移通过额外的优化来提高效率。
语言功能的实现
另一个较小的区别是,CLR是用处理泛型类型和在运行时对这些类型应用参数化的指令构建的。基本上,这意味着CLR可以识别List和List之间的区别,而JVM则不能(Java将泛型作为编译器的一部分来实现)。CLR还允许用户以Structs的形式定义新的值类型,而基于JVM的语言中的值类型是固定的(byte、short、int、long、float、double、char、boolean),尽管有计划改变这一点。java培训课程结构良好,以正确的顺序涵盖了所有这些基本主题,使你的学习更加轻松。
生产监控和异常处理
尽管两者都包括异常处理方法,但两者之间的总体差异可能会影响与不同异常和错误监视工具的兼容性。这反过来又会影响故障排除策略和工作流程。
性能和采用
研究发现,Java编译器生成的字节码较小,这可能会对虚拟机的性能产生影响。然而,当涉及到运行代码时,执行时间几乎是50/50,CLR和JVM的执行速度各快约一半。根据这项研究,当谈到Java和.NET用户之间的激烈对立时,虚拟机本身在区分能力方面的作用似乎比它们在直接影响应用程序效率方面的作用更大。
这在考虑收养时也是有道理的。在企业公司中,开发人员同时使用基于CLR和JVM的语言并不罕见。这种情况尤其可能发生在拥有许多不同部门从事各种项目和应用程序的大公司中。越来越多的人选择参加java培训来开启自己Java开发人员的职业人生,这是一个快速有效的学习方式,可以在短时间内掌握java所需的技能,更好地找到工作。
社区
说到竞争,我们知道.NET和Java都有强大的社区支持。在这些社区中,开发人员在StackOverflow等网站上提出问题并进行深入对话。快速搜索每个虚拟机的名称可以发现,CLR被标记了3250次,而JVM被标记了8628次。
除了StackOverflow,微软和甲骨文自己也培养了大量的社区。在那里,用户可以找到更多与CLR和JVM相关的信息和资源。其中的主题包括云中的实现、疑难解答问题等。除此之外,社区肯定更多地以.NET、Java、C/C++、Scala等个别语言和平台为中心。
总结
从最高级别来看,CLR和JVM之间的差异似乎几乎可以忽略不计。然而,在许多情况下(如果不是大多数的话),虚拟机级别的差异反映了使用它们的语言之间的关键差异。由于这些虚拟机及其相应语言的构建方式,每个虚拟机的功能略有不同,以便提供其创建者想要提供的功能。想学习java的同学可以参加java培训,在专业老师的教导下,可以获得快速提升。