13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

JVM解毒之JVM与Java体系结构

JVM解毒之JVM与Java体系结构

作者:Java识堂 2020-04-15 21:43:22

云计算

虚拟化 所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。

创新互联服务项目包括疏勒网站建设、疏勒网站制作、疏勒网页制作以及疏勒网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,疏勒网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到疏勒省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

你是否也遇到过这些问题?

这段广告语写的好,趁着在家办公学习下JVM,先列出整体知识点:

Java开发都知道JVM是Java虚拟机,上学时还用过的VM也叫虚拟机,先比较一波。

虚拟机与Java虚拟机

所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。

JVM 是什么

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

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

特点

字节码

我们平时所说的java字节码,指的是用java语言编写的字节码,准确的说任何能在jvm平台上执行的字节码格式都是一样的,所以应该统称为jvm字节码。

不同的编译器可以编译出相同的字节码文件,字节码文件也可以在不同的jvm上运行。

Java虚拟机与Java语言没有必然的联系,它只与特定的二进制文件格式——Class文件格式关联,Class文件中包含了Java虚拟机指令集(或者称为字节码、Bytecodes)和符号集,还有一些其他辅助信息。

Java代码执行过程

JVM的位置

JVM是运行在操作系统之上的,它与硬件没有直接的交互。

JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。JDK 物理存在,是 Java Language、Tools、JRE 和 JVM 的一个集合。

JVM整体结构

JVM的架构模型

Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。

两种架构之间的区别:

由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的,优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。

分析基于栈式架构的JVM代码执行过程

进入class文件所在目录,执行javap -v xx.class反解析(或者通过IDEA插件Jclasslib直接查看),可以看到当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等信息。

以上图中的 1+2 为例说明:

  
 
 
 
  1. Classfile /Users/starfish/workspace/myCode/starfish-learning/starfish-learn/target/classes/priv/starfish/jvm/JVM1.class 
  2.   Last modified 2020-2-7; size 487 bytes 
  3.   MD5 checksum 1a9653128b55585b2745270d13b17aaf 
  4.   Compiled from "JVM1.java" 
  5. public class priv.starfish.jvm.JVM1 
  6.   SourceFile: "JVM1.java" 
  7.   minor version: 0 
  8.   major version: 52 
  9.   flags: ACC_PUBLIC, ACC_SUPER 
  10. Constant pool: 
  11.    #1 = Methodref          #3.#22         //  java/lang/Object."":()V 
  12.    #2 = Class              #23            //  priv/starfish/jvm/JVM1 
  13.    #3 = Class              #24            //  java/lang/Object 
  14.    #4 = Utf8                
  15.    #5 = Utf8               ()V 
  16.    #6 = Utf8               Code 
  17.    #7 = Utf8               LineNumberTable 
  18.    #8 = Utf8               LocalVariableTable 
  19.    #9 = Utf8               this 
  20.   #10 = Utf8               Lpriv/starfish/jvm/JVM1; 
  21.   #11 = Utf8               main 
  22.   #12 = Utf8               ([Ljava/lang/String;)V 
  23.   #13 = Utf8               args 
  24.   #14 = Utf8               [Ljava/lang/String; 
  25.   #15 = Utf8               i 
  26.   #16 = Utf8               I 
  27.   #17 = Utf8               j 
  28.   #18 = Utf8               k 
  29.   #19 = Utf8               MethodParameters 
  30.   #20 = Utf8               SourceFile 
  31.   #21 = Utf8               JVM1.java 
  32.   #22 = NameAndType        #4:#5          //  "":()V 
  33.   #23 = Utf8               priv/starfish/jvm/JVM1 
  34.   #24 = Utf8               java/lang/Object 
  35.   public priv.starfish.jvm.JVM1(); 
  36.     flags: ACC_PUBLIC 
  37.     Code: 
  38.       stack=1, locals=1, args_size=1 
  39.          0: aload_0        
  40.          1: invokespecial #1                  // Method java/lang/Object."":()V 
  41.          4: return         
  42.       LineNumberTable: 
  43.         line 3: 0 
  44.       LocalVariableTable: 
  45.         Start  Length  Slot  Name   Signature 
  46.                0       5     0  this   Lpriv/starfish/jvm/JVM1; 
  47.  
  48.   public static void main(java.lang.String[]); 
  49.     flags: ACC_PUBLIC, ACC_STATIC 
  50.     Code: 
  51.       stack=2, locals=4, args_size=1 
  52.          0: iconst_1      //冒号前的数字表示程序计数器的数,常量1入栈 
  53.          1: istore_1      //保存到1的操作数栈中,这里的1表示操作数栈的索引位置 
  54.          2: iconst_2       
  55.          3: istore_2       
  56.          4: iload_1       //加载 
  57.          5: iload_2        
  58.          6: iadd          //常量出栈,求和 
  59.          7: istore_3      //存储到索引为3的操作数栈 
  60.          8: return         
  61.       LineNumberTable: 
  62.         line 6: 0 
  63.         line 7: 2 
  64.         line 8: 4 
  65.         line 9: 8 
  66.       LocalVariableTable: 
  67.         Start  Length  Slot  Name   Signature 
  68.                0       9     0  args   [Ljava/lang/String; 
  69.                2       7     1     i   I 
  70.                4       5     2     j   I 
  71.                8       1     3     k   I 
  72.       MethodParameters: length = 0x5 
  73.        01 00 0D 00 00  

JVM生命周期

虚拟机的启动

Java虚拟机的启动是通过引导类加载器(Bootstrap Class Loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。

虚拟机的执行

虚拟机的退出

有以下几种情况:

Java和JVM规范

Java Language and Virtual Machine Specifications

JVM发展历程

JDK 版本升级不仅仅体现在语言和功能特性上,还包括了其编译和执行的 Java 虚拟机的升级。

Sun Classic VM

Exact VM

Sun HotSpot VM

BEA JRockit VM

IBM J9 VM

虚拟机有很多,此外还有Azul VM、Liquid VM、Apache Harmony、TaobaoJVM、Graal VM等


新闻标题:JVM解毒之JVM与Java体系结构
网站URL:http://cdbrznjsb.com/article/cdigihj.html

其他资讯

让你的专属顾问为你服务