JVM(1):重新认识Java 虚拟机

Java 是目前用户最多,使用范围最广泛的软件开发技术之一.Java 的技术体系主要是由支撑java 程序运行的虚拟机,提供各开发领域接口支持的java API, java 编程语言以及许多第三方Java 框架构成.相比之下,有关Java 虚拟机的资料却显得异常匮乏.这种状况在很大程度上是由Java 开发技术本身的一个重要优点导致的:在虚拟机层面隐藏了底层技术的复杂性以及机器与操作系统的差异性.所以在一般情况下,一个程序员只要了解了必要的java api, java 语法,以及学习适当的第三方开发框架,就已经基本能满足日常开发的需要了.虚拟机会在用户不知不觉中完成对硬件平台的兼容以及对内存等资源的管理工作.因此.了解虚拟机的运作并不是一般开发人员必须掌握的知识.稍后再说为什么还要学习虚拟机.我们先回顾一下,,虚拟机是如何屏蔽了操作系统的差异性而达到跨平台的呢?

1.Java 跨平台原理

JVM 是Java Virtual Machine(Java 虚拟机)的缩写,JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

JVM 将自身定位于字节码和底层平台之间.运行程序的物理机器的情况千差万别,而Java 虚拟机则在千差万别的物理机上建立了统一的运行平台.实现了在任意一台虚拟机上编译的程序都能在任何一台虚拟机上正常运行.Java 语言使用Java 虚拟机屏蔽了与具体平台相关的信息,使得Java 语言编译程序只需生成在Java 虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行.这就是Java 的能够“一次编译,到处运行”的原因。

可能有同学已经发现了,虚拟机上运行的是具有某种规则的文件---> 字节码文件.言下之意,虚拟机其实不关心这一份字节码是从何而来的,只要你给一份格式规范的字节码文件,虚拟机就能运行.我想给大家说的是:因为这一特性,其他很多语言,他们也可以编译成字节码文件,从而运行到虚拟机上.比如scala,groovy,jruby,jyphon...这也最大的体现出了JVM 的包容性。

JVM(1):重新认识Java 虚拟机

 

2.JVM 的类型

在我们第一次接触到虚拟机的时候,我们都会安装环境,并且校验环境是否装成功,我们可以在cmd 窗口键入javac 或者java -version,如果可以获取到对应的信息,说明我们java 的环境就没问题了。

JVM(1):重新认识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(1):重新认识Java 虚拟机

 

3.JVM 的职责

虚拟机很重要,字节码必须要依赖于虚拟机才能运行.那虚拟机的具体职责是什么呢?使用java 命令,可以启动JVM,并且加载指定的字节码文件.所以说,JVM 的职责主要包含两个部分:

  1. 加载指定的字节码文件。
  2. 将字节码文件加载到内存去运行。

而今天我们也主要从这两个方面,来给大家剖析,JVM 如何加载字节码文件以及内存管理的原理。

 

4.为什么要优化JVM

最后,我们回到最开始的一个问题,既然虚拟机隐藏了底层技术的复杂性,让程序员更加关注于业务逻辑,那为什么我们还需要学习JVM,还需要优化JVM 呢?

任何事情都有两面性.随着java 技术的不断发展,它被应用在越来越多的领域之中.其中一些领域,如电力,金融,通信等,对程序的性能,稳定性和可拓展性方面都有极高的要求.程序很可能在10 个人同时使用时完全正常,但是在10000 个人同时使用时就会缓慢,死锁,甚至崩溃.毫无疑问,要满足10000 个人同时使用需要更高性能的物理硬件,但是在绝大多数情况下,提升硬件效能无法等比例的提升程序的运作性能和并发能力,甚至可能对程序运作状况完全没有任何改善.这里面有java 虚拟机的原因:为了达到给所有硬件提供一致的虚拟平台的目的,牺牲了一些与硬件相关的性能特性.更重要的是人为原因:如果开发人员不了解虚拟机一些技术特性的运作原理,就无法写出最适合虚拟机运行和自优化的代码。

其实,目前商用的高性能java 虚拟机都提供了相当多的优化特性和调节手段,用于满足应用程序在实际生产环境中对性能和稳定性的要求.如果只是为了入门学习,让程序在自己的机器上正常运行,那么这些特性可以说可有可无的. 如果用于生产开发,尤其是企业级生产开发,就迫切需要开发人员中至少有一部分人对虚拟机的特性以及调节方法具有很清晰的认识.所以在java 开发体系中,对架构师,系统调优师,高级程序员等角色的需求一直都非常大,学习虚拟机中各种自动运作特性的原理也成为了java 程序员成长道路上必然会接触到的一课。