Java可以获得如此广泛的认可,除了它拥有一门结构严谨、面向对象的编程语言之外,还有许多不可忽视的优点:它摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想;它提供了一种相对安全的内存管理和访问机制,避免了绝大部分内存泄漏和指针越界问题;它实现了热点代码检测和运行时编译及优化,这使得Java应用能随着运行时间的增长而获得更高的性能;它有一套完善的应用程序接口,还有无数来自商业机构和开源社区的第三方类库来帮助用户实现各种各样的功能……Java带来的这些好处,让软件的开发效率得到了极大的提升。

一、JVM 基础

     从传统意义上来看,JCP官方(Java Community Process,就是人们常说 的“Java社区”,这是一个由业界多家技术巨头组成的社区组织,用于定义和发展Java的技术规范)所定义的Java技术体系包括了以下几个组成部分:

  • Java程序设计语言

  • 各种硬件平台上的Java虚拟机实现

  • Class文件格式

  • Java类库API

  • 来自商业机构和开源社区的第三方Java类库

1.jdk

     我们可以把Java程序设计语言、Java虚拟机、Java类库这三部分统称为JDK(Java Development Kit),JDK是用于支持Java程序开发的最小环境。

2.jre

     可以把Java类库API中 的Java SE API子集和Java虚拟机这两部分统称为JRE(Java Runtime Environment),JRE是支持Java程序运行的标准环境。

     下图为jdk,jre,jvm之间的关系图:

image-20220109181013504

     下图展示了Java技术体系所包括的内容,以及JDK和JRE所涵盖的范围。

image-20220109162456170

3.javac 指令

     javac 指令是编译命令,将java源文件编译成.class字节码文件。

例如:javac hello.java

将生成hello.class文件。

4.Java 指令

     Java 指令是运行字节码文件;由java虚拟机对字节码进行解释和运行。

例如:java hello

image-20220109170415993

5.jvm
  • Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。
  • JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回奋,以及可靠的即时编译器。
  • Java技术的核心就是Java虚拟机(JVM,Java Virtual Machine) ,因为所有的Java程序都运行在Java虚拟机内部。

(1)作用:
     Java虛拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令Java 虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。

(2)特点:

  • 一次编译,到处运行
  • 自动内存管理
  • 自动垃圾回收功能

(3)JVM的位置:

image-20220109165938091

image-20220109170619875

(4)JVM的整体结构

image-20220109171050056

(5)Java代码的执行流程:

image-20220109171154764

image-20220109171203761

     将源代码 .java文件通过 javac 的指令生成的class文件,通过java指令将字节码文件.class 进行解析,首先class文件先通过classloader加载到内存中,会用到一些java的相关类库,比如说object 或者String 等等。通过进行调用字节码的解释器和JIT即时编译器,来对字节码文件进行编译;编译之后,再由执行引擎执行,执行引擎面对的是操作系统和硬件。我们可以把整个的java指令的这一部分流程称为jvm。

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

     JVM 其实是一个跨语言的平台,而java是跨平台的语言。除了java语言 jvm还支持多门语言,将近是100多种,JVM也是提供了一些规范。它也帮我们屏蔽了一些操作系统 Linux 或者windows mac。

image-20220109172405437

     JVM怎么决定其他语言也可以在JVM上跑 ,就是因为class。其他的语言,只要是能够生成class文件的那么都可以在JVM上进行执行。

image-20220109172459274

     Java程序,可以在各种平台上执行的,并且不用修改东西, 以前的C语言和C++都是做不到的。如果是程序内部编译成的类Class文件的二进制流也是可以用jvm来执行的,所以我们说java和JVM 是没有任何关系的。

     JVM是有一种规范的,定义了java虚拟机能够执行什么,每一条Java指令Java 虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。规范在oracle官网 https://docs.oracle.com/javase/specs/index.html。

image-20220109173059497

三、常见的虚拟机

1.虚拟机始祖:Sun Classic/ExactVM

     Sun Classic虚拟机的技术已经相当原始,这款虚拟机的使命也早已终结。但仅凭它“世界上第一款商用Java虚拟机”的头衔,就足够有令历史记住它的理由。

2.武林盟主:HotSpot VM

     **相信所有Java程序员都听说过HotSpot虚拟机,它是Sun/OracleJDK和OpenJDK中的默认Java虚拟机,也是目前使用范围最广的Java虚拟机。**但不一定所有人都知道的是,这个在今天看起来“血统纯正”的虚拟机在最初并非由Sun公司所开发,而是由一家名为“Longview Technologies”的小公司设计;甚至这个虚拟机最初并非是为Java语言而研发的,它来源于Strongtalk虚拟机,而这款虚拟机中相当多的技术又是来源于一款为支持Self语言实现“达到C语言50%以上的执行效率”的目标而设计的Self虚拟机,最终甚至可以追溯到20世纪80年代中期开发的Berkeley Smalltalk上。Sun公司注意到这款虚拟机在即时编译等多个方面有着优秀的理念和实际成果,在1997年收购了Longview Technologies公司,从而获得了HotSpot虚拟机。

oracle官方的,我们做实验用的JVM –java –version

在命令行窗口去输入java –version

image-20220109175903489

3.小家碧玉:Mobile/Embedded VM

     Sun/Oracle公司所研发的虚拟机可不仅包含前面介绍到的服务器、桌面领域的商用虚拟机,面对移动和嵌入式市场,也有专门的Java虚拟机产品。

4.天下第二:BEA JRockit/IBM J9 VM

     如果说HotSpot是天下第一的武林盟主,那曾经与HotSpot并称“三大商业Java虚拟机”的另外两位,毫无疑问就该是天下第二了,它们分别是BEA System公司的JRockit与IBM公司的IBM J9。

5.软硬合璧:BEA Liquid VM/Azul VM

     我们平时所提及的“高性能Java虚拟机”一般是指HotSpot、JRockit、J9这类在通用硬件平台上运行的商用虚拟机,但其实还有一类与特定硬件平台绑定、软硬件配合工作的专有虚拟机,往往能够实现更高的执行性能,或提供某些特殊的功能特性。这类专有虚拟机的代表是BEA Liquid VM和Azul VM。

6.挑战者:Apache Harmony/Google Android Dalvik VM

     这节介绍的Harmony虚拟机(准确地说是Harmony里的DRLVM)和Dalvik虚拟机只能称作“虚拟机”,而不能称作“Java虚拟机”,但是这两款虚拟机以及背后所代表的技术体系曾经对Java世界产生了非常大的影响和挑战,当时甚至有悲观的人认为成熟的Java生态系统都有分裂和崩溃的可能。

7.没有成功,但并非失败:Microsoft JVM及其他

     在Java虚拟机二十几年的发展历程中,除去上面介绍的那些被大规模商业应用过的Java虚拟机外,还有许多虚拟机是不为人知地默默沉寂,或者曾经绚丽过但最终夭折湮灭的。我们以其中Microsoft公司的Java虚拟机为代表来介绍一下。

四、插件安装
1.IDEA 插件 Bined

IDEA 插件 在file下选择setting 然后在Plugins 输入Bined对该插件进行安装。

image-20220109181257079

如何使用该插件

安装好了以后,鼠标点击file 选择openAsBinary。

image-20220109181406581

打开后选择一个class文件,然后.class文件就好以十六进制进行 展示:

image-20220109181453665

十六进制的数据流 ---- 可以转化为二进制:

image-20220109181318078

     Class文件是一组以8个字节为基础单位的二进制字节流。各项数据会严格的按照顺序紧凑的排列在class文件中,中间没有分隔符,使得class文件存储的内容几乎全部都是程序运行的。

2.IDEA 插件 jclasslib Bytecode Viewer

在setting选项上 选择plugins然后在输入框输入jclasslib

image-20220109181737181

如果字节码文件没有生成 可以build Project

image-20220109181846820

选中类名

image-20220109181918108

点击view 选择show bytecode with jclasslib

image-20220109181932314

最终展示以下内容:

image-20220108212734925
参考文献:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)周志明 著

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐