介绍Java是跨平台的语言,但是Java本身无法实现跨平台,需要JVM实现跨平台。javac编译出来的class文件可以在Windows、Linux、Mac等系统上运行,只要在系统上安装相应的Java虚拟机即可。达到“一次编译,到处运行”的效果。什么是JVM?JVM是可以运行Java代码的虚拟计算机。既然是虚拟计算机,它还包括自己的CPU、字节码指令集、寄存器、栈、垃圾回收、堆和存储方法域。我们可以理解为JVM本身就是一个操作系统。Java从编译到执行虚拟机是物理机的软件实现。Java是使用在VM上运行的WORA(一次编写,随处运行)的概念开发的。编译器将Java文件编译成Java.class文件,然后将.class文件导入到JVM中,JVM会加载并执行class文件,如下图所示:1.对于Java代码,是对于一个java类Compile,使用java编译器(javac.exe)将源代码编译成.class文件(字节码),可以被JVM类加载器加载。字节码不是机器码,而是一种中间码,与平台无关。java在编译一个类的时候,如果这个类依赖的类还没有被编译,那么编译器会先编译依赖的类,然后引用它。如果java编译器在指定目录下找不到该类所依赖的类.class文件或该类的.java源文件,就会报“Cantfoundsysbol”的异常错误。编译后的字节码文件格式主要分为常量池和方法字节码两部分。常量池记录了出现过的代码(常量、类名、成员变量等)和符号引用(类引用、方法引用、成员变量引用等);方法字节码是每个方法的字节码。2、执行java类的过程大致分为两步:类加载类执行需要说明的是:JVM在程序第一次运行时主动使用该类,会立即加载该类。也就是说,JVM在运行时不会把所有用到的类都加载到内存中,而是只在必须加载的时候才加载,而且只加载一次。从跨平台语言到跨语言平台,目前有一百多种语言可以在Java虚拟机上运行...1.Java是跨平台语言,也就是说程序员只需要编写codeonce写代码的时候,javac编译只编译一次,但是可以在windows上运行,也可以打包在linux或者macos上运行。2.jvm是跨语言平台。任何语言都可以通过jvm运行,只要使用提供的编译器编译对应的语言即可。2.jvm与Java无关。任何语言只要能编译成类,都可以在JVM上编译。(1)虚拟机是一种抽象的计算机,是通过从实际计算机中模拟各种计算机功能来实现的。JAVA虚拟机规范是对JAVA虚拟机实现的一个标准要求,是由oracle制定的,我们平时所说的JAVA虚拟机一般是指JAVA虚拟机规范的具体实现。比如我们最常使用的JAVA虚拟机热点,其实JAVA虚拟机的实现有很多,即使你对JAVA虚拟机规范了解很深并且感兴趣,也可以编写自己的JAVA虚拟机机,当然,这个的难度不难想象。Java虚拟机有自己完整的硬件架构,如处理器、栈、寄存器等,也有相应的指令系统。JVM屏蔽了特定操作系统平台的相关信息,使得Java程序只需要生成运行在Java虚拟机上的目标代码(字节码),无需修改就可以运行在各种平台上。(2)JVM是Java程序运行的环境,也是操作系统的一个应用进程,所以有自己的生命周期,有自己的代码和数据空间。(3)JVM系统主要由JVM的两个内部架构组成,分为三个子系统和两大组成部分,即:类加载(ClassLoader)子系统、执行引擎子系统和GC子系统,组件是内存操作数据区和本地接口。常见的JVM实现1.HotspotHotSpotVM,是SunJDK和OpenJDK中包含的虚拟机,也是目前使用最广泛的Java虚拟机。但不一定每个人都知道的是,这个看似“纯血统”的虚拟机最初并不是由Sun开发的,而是由一家名为“LongviewTechnologies”的小公司设计的;甚至这个虚拟机本来就不是为Java语言开发的,它是从StrongtalkVM衍生出来的,而这个虚拟机中相当一部分技术是从一个支持Self语言的设计中衍生出来的,以达到“实现”的目的C语言执行效率的50%以上”。Sun公司注意到这款虚拟机在JIT编译方面有很多优秀的想法和实际效果,并于1997年收购了LongviewTechnologies,获得了HotSpotVM。HotSpotVM不仅继承了Sun之前两款商用虚拟机的优点(比如上面提到的精准内存管理),而且还拥有很多自己的新技术优势。比如名字中的HotSpot,指的是它的热点代码检测技术(其实这两个VM基本是同时期的独立产品,HotSpot更早一点,HotSpot从一开始就是精准GC,ExactVM也热点检测和HotSpot几乎一样,对于ExactVM和HotSpotVM,哪一个成为Sun主要支持的VM产品,Sun内部一直存在争论,HotSpot击败Exact并不是技术上的胜利),HotSpotVM的热点代码检测能力可以通过执行计数器找到编译值最大的代码,然后通知JIT编译器以方法为单位进行编译。如果一个方法被频繁调用,或者方法中有很多有效循环,就会分别触发标准编译和OSR(on-stackreplacement)编译动作。通过编译器和解释器的适当配合,可以在最佳程序响应时间和最佳执行性能之间取得平衡,无需等待本机代码的输出来执行程序,时间压力大Just-in-timecompilation的相对减少,这样有助于引入更多的代码优化技术,输出更高质量的native代码。在2006年的JavaOne大会上,Sun宣布最终将开源Java,并在次年陆续在GPL协议下发布了JDK各部分(当然也包括HotSpotVM)的源代码,特此OpenJDK是建立在它之上的。这样,HotSpotVM就成为了SunJDK和OpenJDK这两个极其接近的JDK项目的通用虚拟机。2008年和2009年,甲骨文公司分别收购了BEA公司和Sun公司,使甲骨文同时拥有两款优秀的Java虚拟机:JRockitVM和HotSpotVM。Oracle公司宣布在不久的将来(大约在JDK8发布时),将完成对这两个虚拟机的集成,使它们相辅相成,所以我们现在使用的虚拟机应该是集成虚拟机。集成方式大致是在HotSpot的基础上,移植了JRockit的优秀特性,比如使用JRockit的垃圾收集器和MissionControl服务,使用HotSpot的JIT编译器和混合运行时系统。查看JVM,我们只需要使用java-version查看即可。2、JrockitJrockit的前身是BAjrockit,被oracle收购后免费发布,但不开源。jrockit可以看作是一个基于兼容标准JDK的JVM。与原来的JVM相比,jrockit号称速度有明显提升(甚至超过70%)。jrockit在速度上的优势使其应用在时效性强的军事、电信、控制等领域,这也得益于其针对不同处理器架构的优化。它曾经被称为世界上最快的JVM。3、J9J9是IBM推出的Java虚拟机和类。Library,J9广泛应用于IBM的移动设备到企业解决方案。4.MicrosoftVM来自微软的JVM。5.TaobaoVMhotspot深度定制版。一些特定的增强功能在上面得到了极大的扩展。比如创新的GCIH(GCinvisibleheap)技术实现了堆外,可以将生命周期长的Java对象从堆中移到堆外,GC无法管理GCIH内部的Java对象。好处是降低了GC的回收率,提高了GC的回收效率,而且GCIH中的对象也可以在多个Java虚拟机进程间共享。其他扩展技术包括使用PMU硬件的Java分析工具和诊断辅助功能。据说淘宝能手写TaobaoVM的大概有十个人,都是P9、P10级别的。6.LiquidVM直接针对硬件。向上。官网:www.azul.comJDKJREJVMJVM:英文名称(JavaVirtualMachine),就是我们熟悉的Java虚拟机。它只识别xxx.class类型的文件,可以识别class文件中的字节码指令,调用操作系统向上的API来完成动作。所以jvm是Java跨平台性能的核心,下面会详细介绍。JRE:英文名称(JavaRuntimeEnvironment),我们称之为:JavaRuntimeEnvironment。主要包括两部分,jvm的标准实现和Java的一些基础类库。与jvm相比,它多了一部分Java类库。JDK:英文名称(JavaDevelopmentKit),Java开发工具包。jdk是整个Java开发的核心,它集成了jre和一些有用的小工具。例如:javac.exe、java.exe、jar.exe等。显然,三者之间的关系是:层层嵌套的关系。JDK>JRE>JVM为什么我们的电脑安装了jdk后会有两个版本的jre?没有联系。甚至准确的说,无论用哪一种,都是一样的。只是很多人习惯单独安装另一个jre。单独安装的jre虽然没有用过,但可能是一开始大家不知道jdk和jre的关系,所以默认安装了。总结今天的JVM知识点说完了,恐怕道理说不完,后面还有更精彩的。我是沐小农,大家加油!!!
