1.Java 跨平台原理
JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过 在实际的计算机上仿真模拟各种计算机功能来实现的.
JVM 将自身定位于字节码和底层平台之间.运行程序的物理机器的情况千差万别,而 Java 虚拟机则在千差万别的物理机上建立了统 一的运行平台.实现了在任意一台虚拟机上编译的程序都能在任何一台虚拟机上正常运行.Java 语言使用 Java 虚拟机屏蔽了与具体平台 相关的信息,使得 Java 语言编译程序只需生成在 Java 虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行.这就 是 Java 的能够“一次编译,到处运行”的原因. 虚拟机上运行的是具有某种规则的文件---> 字节码文件.言下之意,虚拟机其实不关心这一份字节码是从 何而来的,只要你给一份格式规范的字节码文件,虚拟机就能运行.我想给大家说的是:因为这一特性,其他很多语言,他们也可以编译成字 节码文件,从而运行到虚拟机上.比如 scala,groovy,jruby,jyphon...这也最大的体现出了 JVM 的包容性.
2 JVM 的类型
在我们第一次接触到虚拟机的时候,我们都会安装环境,并且校验环境是否装成功,我们可以在 cmd 或者Mac下的终端窗口键入 javac 或者 java -version,如果可以获取到对应的信息,说明我们 java 的环境就没问题了.
在上图中,我给大家标记了几块区域,这是我们之前没有接触过的(看到了没有出现”不是内部或外部命令”,就直接关闭了 cmd 窗口),我 们可以大致的了解一下上面四部分的含义:
1:表示 JDK 的版本.
2:表示虚拟机的类型为 HotSpot.
3:表示编译器采用 server 模式.
4:编译和解释模式采用混合模式.
Sun 公司制定了虚拟机规范,并没有限定只能是某唯一的虚拟机.从 1996 年初 Sun 公司发布的 JDK1.0 中所包含的 Sun Classic VM(世界上第一款商用 Java 虚拟机) 到今天,曾经涌现,湮灭过许多或经典或优秀或有特色的虚拟机实现,比如 Sun HotSpot VM, BEA JRockit, IBM J9 VM,等等,它们从编译到运行阶段,都有各自的优缺点.这本文中,我们使用 HotSpot 虚拟机.
JVM—java虚拟机 要事先在操作系统上安装对应版本的JVM,把java已经开发好了的程序放入到JVM中去执行,使得在不同的操作系统上执行相同的java程序得到的结果是一样的,屏蔽了底层操作系统差异性
JRE(java Runtime Environment java运行时环境)提供了java程序执行的环境
JRE=JVM+核心类库(提供java程序启动时必须的信息)
JDK(java Development Kit java开发工具包)提供java程序的开发环境以及执行环境
JDK = JRE+Kit(开发工具包)
3 JVM 的职责
虚拟机很重要,字节码必须要依赖于虚拟机才能运行.那虚拟机的具体职责是什么呢?使用 java 命令,可以启动 JVM,并且加载指定的 字节码文件.所以说,JVM 的职责主要包含两个部分:
1. 加载指定的字节码文件.
2. 将字节码文件加载到内存去运行.
4 为什么要优化 JVM
最后,我们回到最开始的一个问题,既然虚拟机隐藏了底层技术的复杂性,让程序员更加关注于业务逻辑,那为什么我们还需要学习 JVM,还需要优化 JVM 呢?
任何事情都有两面性.随着 java 技术的不断发展,它被应用在越来越多的领域之中.其中一些领域,如电力,金融,通信等,对程序的性 能,稳定性和可拓展性方面都有极高的要求.程序很可能在 10 个人同时使用时完全正常,但是在 10000 个人同时使用时就会缓慢,死锁, 甚至崩溃.毫无疑问,要满足 10000 个人同时使用需要更高性能的物理硬件,但是在绝大多数情况下,提升硬件效能无法等比例的提升程 序的运作性能和并发能力,甚至可能对程序运作状况完全没有任何改善.这里面有 java 虚拟机的原因:为了达到给所有硬件提供一致的虚 拟平台的目的,牺牲了一些与硬件相关的性能特性.更重要的是人为原因:如果开发人员不了解虚拟机一些技术特性的运作原理,就无法写 出最适合虚拟机运行和自优化的代码.
其实,目前商用的高性能 java 虚拟机都提供了相当多的优化特性和调节手段,用于满足应用程序在实际生产环境中对性能和稳定性 的要求.如果只是为了入门学习,让程序在自己的机器上正常运行,那么这些特性可以说可有可无的. 如果用于生产开发,尤其是企业级生 产开发,就迫切需要开发人员中至少有一部分人对虚拟机的特性以及调节方法具有很清晰的认识.所以在 java 开发体系中,对架构师,系统 调优师,高级程序员等角色的需求一直都非常大,学习虚拟机中各种自动运作特性的原理也成为了 java 程序员成长道路上必然会接触到的。