【死磕JVM】JVM快速入门以前戏篇

简介

Java是一门能够跨平台的语言,可是Java自己是不能够实现跨平台的,须要JVM实现跨平台。javac编译好后的class文件,在Windows、Linux、Mac等系统上,只要该系统安装对应的Java虚拟机,class文件均可以运行。达到 ”一次编译,处处运行” 的效果。java

什么是JVM

JVM是能够运行在Java代码的虚拟的计算机,既然是虚拟的计算机,固然也包含本身的CPU、字节码指令集、寄存器、栈、垃圾回收、堆和存储方法域,咱们能够理解成JVM本身就是一套操做系统。linux

Java从编译到执行

Virtual Machine是物理机器的软件实现。Java是用在VM上运行的WORA(Write Once Run Anywhere)概念而开发的。编译器将Java文件编译为Java .class文件,而后将.class文件输入到JVM中,JVM会加载并执行类文件,以下图所示:程序员

在这里插入图片描述

1. 编译

对于Java代码来讲,是对于一个java类的编译,利用java编译器(javac.exe)将源码编译成可以被JVM的类加载器加载的.class文件(字节码),字节码不是机器码,是一个中间代码,与平台无关。java编译一个类的时候,若是这个类所依赖的类尚未被编译,编译器就会先编译这个被依赖的类,而后引用,若是java编译器在指定的目录下找不到该类所依赖的类的 .class文件或者 .java源文件,就会报 "Cant found sysbol"的异常错误。macos

编译后的字节码文件格式主要分为两部分:常量池和方法字节码。windows

  • 常量池记录的是代码出现过的(常量、类名、成员变量等)以及符号引用(类引用、方法引用,成员变量引用等);
  • 方法字节码中放的是各个方法的字节码。

2. 执行

java类执行的过程大概分为两个步骤:性能优化

  1. 类的加载
  2. 类的执行

须要说明的一点的是:JVM主要在程序第一次运行时主动使用类的时候,才会当即去加载。换言之,JVM并非在运行时就会把全部使用到的类都加载到内存中,而是用到,不得不加载的时候,才加载进来,并且只加载一次。markdown

从跨平台的语言到跨语言的平台

目前有一百多种语言能够跑在Java虚拟机上…
在这里插入图片描述架构

一、Java是跨平台的语言

意思是说程序员写代码的时候只须要写一次代码,javac编译也只编译一次,可是能够在windows上运行,也能够把打好的包放到linux或者macos上运行。oracle

在这里插入图片描述

二、jvm是跨语言的平台

任何语言只要使用提供的编译器编译相应的语言,经过jvm就能够运行了在这里插入图片描述jvm

二、jvm与Java无关

任何语言只要你能编译成class就能够编译在JVM上

在这里插入图片描述

JVM

JVM是一种规范
(1)虚拟机是一种抽象的计算机,经过从实际的计算机中仿真模拟各类计算机功能来实现的。JAVA虚拟机规范是一种对JAVA虚拟机实现的规范要求,是由oracle制定的,而咱们平时常说的JAVA虚拟机通常是指的一种具体的JAVA虚拟机规范的实现。好比咱们最常用的JAVA虚拟机hotspot,其实JAVA虚拟机还有不少种实现,甚至若是你对JAVA虚拟机规范有了深刻的了解并且对此有兴趣的话,能够写一个本身的JAVA虚拟机,固然这其中的难度不难想象。Java虚拟机有本身完善的硬体架构,如处理器、堆栈、寄存器等,还具备相应的指令系统。JVM屏蔽了与具体操做系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就能够在多种平台上不加修改地运行。

(2)JVM是Java程序运行的环境,同时是一个操做系统的一个应用程序进程,所以它有本身的生命周期,也有己的代码和数据空间。

(3)JVM体系主要是两个JVM的内部体系结构分为三个子系统和两大组件,分别是: 类装载(ClassLoader)子系统、执行引擎子系统和GC子系统 组件是内存运行数据区域和本地接口。

常见的JVM实现

1、Hotspot

HotSpot VM,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。
但不必定全部人都知道的是,这个目前看起来“血统纯正”的虚拟机在最初并不是由Sun公司开发,而是由一家名为“Longview Technologies”的小公司设计的;
甚至这个虚拟机最初并不是是为Java语言而开发的,它来源于Strongtalk VM,
而这款虚拟机中至关多的技术又是来源于一款支持Self语言实现“达到C语言50%以上的执行效率”的目标而设计的虚拟机,
Sun公司注意到了这款虚拟机在JIT编译上有许多优秀的理念和实际效果,在1997年收购了Longview Technologies公司,从而得到了HotSpot VM。

HotSpot VM既继承了Sun以前两款商用虚拟机的优势(如前面提到的准确式内存管理),也有许多本身新的技术优点,
如它名称中的HotSpot指的就是它的热点代码探测技术(其实两个VM基本上是同时期的独立产品,HotSpot还稍早一些,HotSpot一开始就是准确式GC,
而Exact VM之中也有与HotSpot几乎同样的热点探测。
为了Exact VM和HotSpot VM哪一个成为Sun主要支持的VM产品,在Sun公司内部还有过争论,HotSpot战胜Exact并不能算技术上的胜利),
HotSpot VM的热点代码探测能力能够经过执行计数器找出最具备编译价值的代码,而后通知JIT编译器以方法为单位进行编译。
若是一个方法被频繁调用,或方法中有效循环次数不少,将会分别触发标准编译和OSR(栈上替换)编译动做。
经过编译器与解释器恰当地协同工做,能够在最优化的程序响应时间与最佳执行性能中取得平衡,并且无须等待本地代码输出才能执行程序,
即时编译的时间压力也相对减少,这样有助于引入更多的代码优化技术,输出质量更高的本地代码。

在2006年的JavaOne大会上,Sun公司宣布最终会把Java开源,并在随后的一年,陆续将JDK的各个部分(其中固然也包括了HotSpot VM)在GPL协议下公开了源码,
并在此基础上创建了OpenJDK。这样,HotSpot VM便成为了Sun JDK和OpenJDK两个实现极度接近的JDK项目的共同虚拟机。

在2008年和2009年,Oracle公司分别收购了BEA公司和Sun公司,这样Oracle就同时拥有了两款优秀的Java虚拟机:JRockit VM和HotSpot VM。
Oracle公司宣布在不久的未来(大约应在发布JDK 8的时候)会完成这两款虚拟机的整合工做,使之优点互补,因此咱们如今使用的虚拟机应该就是整合以后的虚拟机。
整合的方式大体上是在HotSpot的基础上,移植JRockit的优秀特性,譬如使用JRockit的垃圾回收器与MissionControl服务,使用HotSpot的JIT编译器与混合的运行时系统。

查看JVM,咱们只须要使用 java -version就能够查看了
在这里插入图片描述

2、Jrockit

jrockit前身是BA jrockit,后被oracle收购,并免费发布,但并不开源。

jrockit能够看作是兼容标准的JDK基础上的JVM,同原有的JVM相比,jrockit声称在速度上有显著的提升(甚至超过70%),jrockit在速度上的优点使其应用在时间敏感的领域内,如军事,电信,控制等,这也得益于其针对不一样处理器架构所作的优化,曾经号称是世界上最快的JVM

3、J9

J9 是一个IBM推出的Java虚拟机和类库,J9在IBM的从移动设备到企业解决方案中普遍的被使用

4、Microsoft VM

来自于微软的JVM

5、TaobaoVM

hotspot深度定制版,除了在性能优化方面下足了功夫,TaobaoVM还在HotSpot的基础之上大幅度扩充了一些特定的加强实现。好比创新的GCIH(GC invisible heap)技术实现off-heap,这样一来就能够将生命周期较长的Java对象从heap中移至heap以外,而且GC不能管理GCIH内部的Java对象,这样作最大的好处就是下降了GC的回收平率以及提高了GC的回收效率,而且GCIH中的对象还可以在多个Java虚拟机进程中实现共享。其余扩充技术还有利用PMU hardware的Java profiling tool和诊断协助功能等。

听说淘宝里面大概有十我的可以手写TaobaoVM,都是P9 P10级别的

6、LiquidVM

直接针对于硬件

7、azul zing

最新垃圾回收的业界标杆,性能极高,可是这个是收费的,而且只有土豪才用的起。

官网:www.azul.com

JDK JRE JVM

在这里插入图片描述
JVM : 英文名称(Java Virtual Machine),就是咱们耳熟能详的 Java 虚拟机。它只认识 xxx.class 这种类型的文件,它可以将 class 文件中的字节码指令进行识别并调用操做系统向上的 API 完成动做。因此说,jvm 是 Java 可以跨平台的核心,具体的下文会详细说明。

JRE : 英文名称(Java Runtime Environment),咱们叫它:Java 运行时环境。它主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库。它相对于 jvm 来讲,多出来的是一部分的 Java 类库。

JDK : 英文名称(Java Development Kit),Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。

显然,这三者的关系是:一层层的嵌套关系。 JDK>JRE>JVM

为何咱们的电脑在装完 jdk 后会有两个版本的 jre?
在这里插入图片描述
没有联系。甚至准确的来讲,它俩是同样的,不管是用哪个都是能够的。只是不少人习惯将会单独安装另外一个 jre,虽然单独安装的 jre 也并无被使用,缘由可能就是刚开始你们都不清楚 jdk 和 jre 之间的关系,因此就默认的都安装上了。

小结

今天的JVM知识点就讲完了,有疑问的小伙伴能够留言或评论

怕什么真理无穷,进一步有进一步的欢喜,我是牧小农,你们加油!!!